将整个结构数组传递给C中的Pthread_Create

时间:2011-02-25 21:20:08

标签: c arrays struct pthreads

我在这个问题上遇到了一些麻烦。我有一个包含2个结构的数组。我需要将该数组传递给线程函数,并能够访问和操作该数组中的两个结构。我查看并发现的所有示例通常都会将数组的每个元素传递给pthread_create,但在我的程序的上下文中,我一次只能调用一个pthread_create实例,所以我无法传递数组中的每个元素一个一个人。这是我现在正在查看的简化代码(如果您需要更多相关信息,请告诉我们):

typedef struct foo
{
    int a;
    char b[100];
}foo;


void *threadFunction(void *arr);
.
.
.
int main(int argc, char *argv[])
{
    foo temp1, temp2;
    //Somewhere between here temp1 and temp2 are initialized and filled
    foo arr[2];
    arr[0] = temp1;
    arr[1] = temp2;
    pthread_create(&thread, &attr, threadFunction, (void *)arr);
.
.
.
}
void *threadFunction(void *arr)
{       
    foo *temp = (foo *)malloc(2 * sizeof(foo));
    temp = (foo *)arr;
    .
    .
    .
    free(temp);
    pthread_exit(NULL);
}

我也试着说

foo *temp = (foo *)arr;

显而易见的解决方案是将temp []中的每个元素分配给arr []中的元素,但这不起作用。

结果是我只能访问临时数组中的第一个元素,即使我尝试访问temp [1],这是有道理的,因为我没有看到我在arr []中分配第二个元素任何事情。

我确定我遗漏了一些明显的东西,但我似乎无法找到它,而且我无法找到有关这种特定情况的任何相关信息。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

它涉及将void指针强制转换为结构的指针类型,然后取消引用该指针表达式以获取特定偏移量的元素:

*((foo *) arr); /* first element */
*((foo *) arr + 1); /* second element */

编辑:另一个重要问题 - 必须在arr之外全局定义main数组。因为新创建的线程将拥有自己的堆栈空间,所以访问另一个线程的堆栈并不是非常安全。