[英]Struct passed to thread (unix) has wrong values
我正在编写基于C(在Unix下)并发性的一段代码,但似乎从根本上就存在一些问题。
我有一个像这样的全局结构:
struct i_arg {
int k;
int j;
};
在运行时,我采用最大值N
并分配大小为N-1
的struct i_arg
数组
struct i_arg *t_arg;
...
t_arg = (struct i_arg *) malloc((n-1) * sizeof(struct i_arg));
for(i = 0; i < n-1; i++) {
t_arg[i].k = i;
t_arg[i].j = i+1;
}
...
给定N
,我还将创建N-1
线程,并将t_arg[i]
的指针传递给每个线程
for(i = 0; i < n-1; i++) {
retcode = pthread_create(&tid[i], NULL, swap, (void *) &t_arg[i]);
if (retcode != 0)
fprintf(stderr, "Creation of thread %d failed.\n", i);
}
swap
函数立即执行(struct i_arg)
为(struct i_arg)
:
void *swap(void *arg) {
struct i_arg *ind;
int i,j;
ind = (struct i_arg *) arg;
i = ind->k;
j = ind->j;
fprintf(stdout,"Thread %d working... with i= %d, i+1=%d\n", i, i, j);
...
pthread_exit(0);
}
现在的问题是:
当N
是偶数时,创建的第一个线程(线程0)应接收k=0
和j=1
arg
。 实际上,它接收到j=1
但k从0变为随机数。 fprintf
将打印
Thread 4747264 working... with i= 4747264, i+1=1
如果N
为奇数,则第一个线程运行顺利,并且正确地将输出为
Thread 0 working... with i= 0, i+1=1
我试图usleep
后每个主线程pthread_create()
其结果是,如果我让他睡至少60微秒,这个问题就解决了......但我怎么能避免usleep
,而无需一个错误的值?
问题可能与您在swap
函数中剪切并显示为...
,您是否将其存储回i_arg结构的t_arg数组中?
for(i = 0; i < n-1; i++) {
t_arg[i].k = i;
t_arg[i].j = i+1;
}
当i == n-2时,您会将j初始化为n-1,这是数组大小之后的1。 这是您的分配方式:
t_arg = (struct i_arg *) malloc((n-1) * sizeof(struct i_arg));
这就是你初始化的方式
t_arg[i].j = i+1; /* bug is likely here when i==n-2, */
如果使用t_arg[i].j
作为数组的索引,则当i == n-2和j == n-1时,它将是未定义的。
我的建议是分配N
个条目并分派N-1个线程。 对于N
个条目,只有N-1个相邻的事物可以交换(对于N> 0)。
t_arg = (struct i_arg *) malloc( n * sizeof(struct i_arg) );
for(i = 0; i < n; i++) {
t_arg[i].k = i;
t_arg[i].j = i+1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.