2012-03-30 27 views
-1

我想用posix线程写一些代码,但我从第一步卡住,说实话我不明白为什么。我知道我的问题可能与某种同步有关,但我无法弄清楚。动态pthread产卵同步所需(???)

我在主要是以下几点:

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

当我尝试从主,也是process_x功能我得到的是这样的打印x值:

主:1

主:2

主:3

主营:4

主营:5

Process_x:5

我怎么会错过吗?

----编辑-----

好吧,也许我需要提供一些更多的信息。 getX函数接收来自套接字的数据并返回一个标识符,而对于我们现在的需要,process_x只是输出它接收到的参数。

+1

你对这个问题和你的代码非常熟悉,但我们不是。请给我更多的解释并发布代码?应该发生什么? – gbulmer 2012-03-30 09:40:09

+0

你的'Main:%d'打印在哪里? – 2012-03-30 09:44:11

+0

所以我认为印刷的东西是不对的。哪里不对?你期望它打印什么? – ArjunShankar 2012-03-30 09:48:24

回答

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); 
} 
0

一旦创建线程,将不会立即执行线程使用致电pthread_create的电话。调度程序可以决定保持队列。在此期间,您的while循环已运行5次,并且x的值也可能已更改为5.现在,当您的线程被最终计划时,它(它们)只会看到您的最新值x,因此会打印(s)only 5.

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

没有默认的方式来获取以任何特定顺序执行的pthread。你需要使用像信号量这样的同步技术。此外,如果你想看到Process_x打印所有你的价值观,转换x到一个数组,并通过x[i]作为参数传递给pthread_create

+0

我的问题实际上不是以正确的顺序打印消息。我知道为了做到这一点,我需要在线程之间使用互斥体和信号。我只是想所有的线程来处理 – gkaran89 2012-03-30 10:04:57

+0

如果你改变'x'到一个数组,我建议,所有线程应执行并显示正确的价值观,虽然不是为了,因为你已经知道 – 2012-03-30 10:07:09

+0

@ gkaran89你传递一个指针到X到你的线程。你的循环的下一次迭代改变了X,并且发生了不好的事情。您可以每次动态分配X,因此每个线程都可以获得其独特的价值 – nos 2012-03-30 10:11:54

1

你需要考虑你的x地址传递给一个线程,然后无需等待线程要完成打印,请修改它的值。显然,这意味着如果在线程打印之前有一些迭代已经结束,那么值就会改变。

两种方法解决此问题:

1)使用pthread_join,等待线程完成。这是根本无用的。因为那么产生新线程有什么意义呢?

OR

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

malloc一个新的整数,分配x到整数,新malloc d整数传递给线程,让线程free它完成时。

+0

关于第一个问题:是的,我已经这样做了,但我在这里做了一个错字。 关于改变你的记忆可能是对的。现在就试试吧。 – gkaran89 2012-03-30 10:03:37

+0

每次数组都比malloc更容易。不是吗? – 2012-03-30 10:09:00

+1

他正在做'while(1)'无限循环,所以可能不会。我们甚至不知道阵列应该有多宽。 – ArjunShankar 2012-03-30 10:12:30