C 传递给线程(unix)的结构具有错误的值
我正在编写一段基于C(在Unix下)并发性的代码,但似乎在底层存在一些问题 我有这样一个全局结构:C 传递给线程(unix)的结构具有错误的值,c,multithreading,unix,struct,pthreads,C,Multithreading,Unix,Struct,Pthreads,我正在编写一段基于C(在Unix下)并发性的代码,但似乎在底层存在一些问题 我有这样一个全局结构: struct i_arg { int k; int j; }; 在运行时,我取一个最大数N,并分配一个大小为N-1 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
struct i_arg {
int k;
int j;
};
在运行时,我取一个最大数N
,并分配一个大小为N-1
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;
}
...
而swap
函数会立即执行转换到(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)应接收arg
,其中k=0
和j=1
。实际上,它接收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\u create()
之后删除主线程。结果是,如果我让它休眠至少60微秒,问题就解决了……但是我如何避免usleep
而不产生错误的值呢 问题可能在于您在交换
函数中剪下并显示为…
的代码,您是否将其存储回i_arg结构的t_arg数组中
for(i = 0; i < n-1; i++) {
t_arg[i].k = i;
t_arg[i].j = i+1;
}
这就是初始化的方式
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));
对于(i=0;i
您的代码在Mac OS上运行良好。我刚刚在顶部添加了pthread\u tid[n-1]
并在底部的循环中添加了pthread\u join(tid[I],NULL)
,它实现了您所期望的功能。也许你在别的地方有虫子?我建议启用所有编译器警告并在valgrind下运行您的程序。鉴于让主线程睡眠足够长的时间“解决”了问题,这表明启动线程后主线程中的一些代码正在破坏线程试图使用的数据结构。我同意问题不在你展示的代码中。请学习有关如何创建MCTRE或SSCCE()的指南。
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 = (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;
}