繁体   English   中英

传递给线程(unix)的结构的值错误

[英]Struct passed to thread (unix) has wrong values

我正在编写基于C(在Unix下)并发性的一段代码,但似乎从根本上就存在一些问题。

我有一个像这样的全局结构:

struct i_arg {
    int k;
    int j;
};

在运行时,我采用最大值N并分配大小为N-1struct 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=0j=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM