需要动态pthread产生同步(???)

时间:2012-03-30 09:37:46

标签: c pthreads

我正在尝试使用posix线程编写一些代码,但我从第一步开始就陷入困境,说实话我无法理解为什么。我知道我的问题可能与某种同步有关,但我无法弄明白。

我的主要内容如下:

while(1){
  int x = getX();
  pthread_t t;
  printf("Main: %d\n",x);
  pthread_create(&t, NULL, process_x, &x);
}

当我尝试从main和process_x函数打印x值时,我得到的是这样的:

  

主要:1

     

主要:2

     

主要:3

     

主要:4

     

主要:5

     

Process_x:5

我在这里想念什么?

----编辑-----

好的,也许我需要提供更多信息。 getX函数从套接字接收数据并返回标识符,而现在我们需要process_x只打印它接收的参数。

3 个答案:

答案 0 :(得分:1)

您需要考虑将x的地址传递给线程,然后在不等待线程完成打印的情况下,修改它的值。显然,这意味着如果在线程打印它的值之前几次迭代结束,那么值就会发生变化。

围绕这个的两种方式:

1)使用pthread_join并等待线程完成。这实际上是无用的。因为那么产生新线程的重点是什么?

OR

2)为每个线程分配一个新地址,让线程在完成打印后释放它。

即。 malloc一个新的整数,为该整数分配x,将新的malloc d整数传递给线程,完成后让线程free

答案 1 :(得分:0)

使用对pthread_create的调用,一旦创建线程就不会执行。调度程序可以决定将其保留在队列中。在此期间,您的while循环已运行5次,x的值也可能已更改为5.现在,当您的线程最终被安排时,它(它们)只会看到您的x的最新值,因此只有5个。

我强烈怀疑Process_x只打印一次?

没有以任何特定顺序执行pthread的默认方式。您需要使用一些同步技术,如信号量。另外,如果您希望Process_x打印所有值,请将x转换为数组并将x[i]作为参数传递给pthread_create

答案 2 :(得分:0)

显然使用malloc不起作用,因为它将x设置为0,因此进程总是读为0.但是由于每个人的想法,我终于使用条件变量使它工作,现在一切正常。这是代码。

int main{
  pthread_t t;
  int x;
  while(1){
    pthread_mutex_lock(&receive);
    x = getX();
    printf("Main: %d\n",x);
    pthread_create(&t, NULL, process_x, &x);
    pthread_cond_wait(&goOn, &receive);
    pthread_mutex_unlock(&receive);
  }
}

void *process_x(void* arg){
  pthread_mutex_lock(&receive);
  int x = *(int *) arg;
  pthread_cond_signal(&goOn);
  pthread_mutex_unlock(&receive);
}