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

我正在编写一段基于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 = 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;
}