【问题标题】:Passing struct from array of structs to pthread_create将结构从结构数组传递给 pthread_create
【发布时间】:2011-02-06 03:17:55
【问题描述】:

我创建了一个结构数组。我试图通过 pthread_create 将此数组中的一个元素传递给线程。我收到以下错误(它们是针对我在 for 循环中的 2 个 pthread_create 调用):

/../a2/main.cpp|117|error: invalid conversion from ‘void (*)(serverDataStruct*)’ to ‘void* (*)(void*)’|

/../a2/main.cpp|117|error:   initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’|

我看了一遍,似乎我的语法是正确的。我将在下面发布我的代码。有人可以帮我吗?

struct serverDataStruct
{

};

struct clientDataStruct
{

};

void serverFunc(serverDataStruct *serverData);

void clientFunc(int *ticketNum);


struct serverDataStruct serverDataArray[MAX_NUM_SERVERS];   
struct clientDataStruct clientDataArray[MAX_NUM_CLIENTS]; 

int main (  )
{
    for(int i = 0; i < numServers; i++) //create servers
    {
        pthread_create( &serverTID[i], NULL, serverFunc, (void*) &serverDataArray[i]); //PROBLEM LINE*****************************************************************

    }

    for(int i = 0; i < numCustomers; i++)
    {
        pthread_create( &clientTID[i], NULL, clientFunc, (void*) &clientDataArray[i]); //PROBLEM LINE*****************************************************************

    }
}


void *serverFunc(void *serverData)
{

}


void *clientFunc(void *clientData)
{

}

【问题讨论】:

  • 你应该添加4个空格让它看起来更好
  • 如果您 (1) 将代码缩小到 10 行左右并给出相同的错误,并且 (2) 使用 {} 按钮格式化你的代码整齐。

标签: c++ struct pthreads


【解决方案1】:

您的函数定义正确,但您的前向声明不正确。

改变这两行:

void serverFunc(serverDataStruct *serverData);
void clientFunc(int *ticketNum);

匹配函数定义:

void *serverFunc(void *serverData);
void *clientFunc(void *ticketNum);

顺便说一句,请编辑您的问题以删除所有不必要的代码 :-) 并请格式化 :-)

【讨论】:

  • k,我已经删除了大部分不相关的代码。谢谢,我想我需要一双新的眼睛才能看到那个错误。另一个问题,但现在我收到以下格式的错误:
  • 哎呀,继续之前的评论:“未定义对 `sem_open' 的引用”,我为我的所有 pthread 函数(_create、_mutex 等)和信号量用法都得到了这个。有什么想法吗?
  • @Robin:你包括哪些标题?我建议接受这个答案并为sem_open 问题打开一个新问题。当你发布这个问题时,尽量不要发布超过 10 行代码。在 10-15 行代码中重现您的错误应该是微不足道的,您甚至可以在此过程中解决您的问题。我的建议是复制您的文件并继续删除内容,直到您有少量代码仍然存在问题。
  • 会的。谢谢贾里德。这是我的第一篇文章,所以只是学习正确的发帖礼仪。
  • @Robin:不用道歉,我们是来帮忙的。
【解决方案2】:

试试这个:

线程函数::

void serverFunc(void * serverData){ struct clientDataStruct * client = (struct clientDataStruct *) serverData; // 就像一个 // 例子 …… }

pthread_create 调用:

pthread_create(&serverTID[i], NULL, serverFunc, &serverDataArray[i]);

如果您使用的是 c++ 代码: 在包含所有标头和命名空间之后,在代码开头包含此内容,以防止出现警告:

extern "C"{void * serverFunc(void *);}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2020-09-26
    • 1970-01-01
    • 2011-07-21
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多