【问题标题】:I have problem using thread passing argument我在使用线程传递参数时遇到问题
【发布时间】:2019-05-28 13:48:13
【问题描述】:

我正在尝试使用二进制信号量解决读取器/写入器问题。

我期望的结果是我是 writer2,data 是 1。我是 reader3,data 是 2。

但是,结果是我是 writer0,我是 reader0 data1,data2 ~ data5。 如何修复我的代码?

int data = 0; // global variable.
void main()
{
    //other code is omitted.

    int i;
    for(i=0; i<5; i++)
            pthread_create(&w[i], NULL, writer, &i);

    for(i=0; i<20; i++)
            pthread_create(&r[i], NULL, reader, &i);

    for(i=0; i<5; i++)
            pthread_join(w[i], NULL);

    for(i=0; i<20; i++)
            pthread_join(r[i], NULL);
}

【问题讨论】:

  • 你的问题不清楚:你能发writerread的代码吗?
  • 您是否故意将i 变量传递给您的线程?它可能无法在您的线程中使用,因为它将被主线程修改。
  • @Mathieu 看起来它是由同一个 OP 在之前的问题中以不同的名称发布的:stackoverflow.com/questions/56341997/… 给 OP:强烈建议不要在 SO 上创建多个帐户。
  • @su11 两个函数的代码需要贴出来
  • @EugeneSh。链接的问题是关于另一个问题(即核心转储)。在那之后已经解决了 OP 有一个新问题,所以可以发布一个新问题。那就是说我不确定为什么它是一个新帐户

标签: c multithreading pthreads


【解决方案1】:

你的问题来自你传递给你的线程的参数:它会改变你的线程使用它的速度。

一种解决方案是为每个线程创建一个参数:

int i;
for(i=0; i<5; i++)
{
    int *par = malloc(sizeof *par);
    *par = i;
    pthread_create(&w[i], NULL, writer, par);
}

警告由于已经分配了一些内存,因此必须在以下位置释放它:

void * writer(void *parameter)
{
    int *par = (int*)parameter;

    /* do some operation with *par */
    printf("I'm thread %d\n", *par );

    /* free it*/
    free(par);    

    .... rest of function code ...
}

如果您对内存分配感到满意,您可以只使用一些参数数组:

/* w array guessed from rest of code*/
thread_t w[5];
int par_w[5];
int i;
for(i=0; i<5; i++)
{
    par_w[i] = i;        
    pthread_create(&w[i], NULL, writer, &par_w[i]);
}

【讨论】:

    【解决方案2】:

    您的问题可能与 i 的值有关,它没有正确的线程值,有两个原因

    • 首先你没有同步,所以 main 可以在线程读取它之前更改 i 的值

    • 第二个从其他线程访问局部变量不保证:

    C11 草案标准 n1570:6.2.4 对象的存储持续时间 5 其标识符声明为没有链接且没有存储类说明符 static 的对象具有自动存储持续时间,一些复合文字也是如此。尝试从与对象关联的线程以外的线程间接访问具有自动存储持续时间的对象的结果是实现定义的

    这是分配内存并给出地址的好方法,例如:

    for(i=0; i<5; i++) {
      int * p = malloc(sizeof(int));
    
      *p = i;
      pthread_create(&w[i], NULL, writer, p);
    }
    

    当然,创建的线程负责释放内存

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多