我在这个问题上遇到了一些麻烦。我有一个包含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 []中分配第二个元素任何事情。
我确定我遗漏了一些明显的东西,但我似乎无法找到它,而且我无法找到有关这种特定情况的任何相关信息。谢谢你的帮助。
答案 0 :(得分:1)
它涉及将void指针强制转换为结构的指针类型,然后取消引用该指针表达式以获取特定偏移量的元素:
*((foo *) arr); /* first element */
*((foo *) arr + 1); /* second element */
编辑:另一个重要问题 - 必须在arr
之外全局定义main
数组。因为新创建的线程将拥有自己的堆栈空间,所以访问另一个线程的堆栈并不是非常安全。