线程的不可预测的行为

时间:2010-12-07 10:19:05

标签: c++ pthreads

我正在尝试实现这个如何使用pthread库同步线程的简单示例:

#include <iostream>
#include <pthread.h>

using namespace std ;

static pthread_mutex_t locker;
pthread_cond_t cond;
volatile bool ok=false;


void *func2(void *data)
{
int i;
for(i=0;i<100;i++)
{
    pthread_mutex_lock (&locker);
    cout << "1";
    pthread_mutex_unlock(&locker);
    if(i==10)
    {
        ok=true;
        pthread_cond_signal(&cond);
    }

}

pthread_exit(0);

  }

void *fun1(void *data)
{
int i;
for(i=0;i<100;i++)
{

    if(ok==false){
    pthread_cond_wait(&cond, &locker);
    }

    pthread_mutex_lock (&locker);
    cout << "2";
    pthread_mutex_unlock(&locker);
}

pthread_exit(0);
   }




   int main(void)
  {


pthread_t thread1, thread2;
void *retour_thread;


pthread_mutex_init (&locker, NULL);
pthread_cond_init(&cond, NULL);

if(pthread_create (&thread1, NULL, fun1, NULL) < 0)
{
    cout << "problem thread";
    exit(1);
}
if(pthread_create (&thread2, NULL, func2, NULL) < 0)
{
    cout << "problem thread";
    exit(1);
}


(void)pthread_join(thread1,&retour_thread);
(void)pthread_join(thread2,&retour_thread);

return 0;
    }

我应该看到的是func1等到条件(ok == true)然后处理func2 ...但我得到的是不可预测的并且没有同步!!!

任何帮助和感谢adofnce

3 个答案:

答案 0 :(得分:1)

  • 条件规则1 变量:等待条件变量 拿着锁(等待时) 锁将被释放)
  • 条件第2条 变量:总是使用“while 条件,等待条件 变量“(避免虚假信号)

答案 1 :(得分:0)

您需要在调用pthread_cond_wait之前获取互斥锁,并在pthread_cond_wait返回后重新获取互斥锁。你的fun1()应该类似于:

void *fun1(void *data)
{
    int i;
    for(i=0;i<100;i++)
    {
        pthread_mutex_lock (&locker);
        if(ok==false)
            pthread_cond_wait(&cond, &locker);

        cout << "2";
        pthread_mutex_unlock(&locker);
    }
}

更新

你有一场比赛,其中func2()可以比fun1()消耗得更快。如果您想要备用“1”和“2”输出,则需要双向反馈。

答案 2 :(得分:0)

我对pthread_cond_wait的体验是它确实有点不可预测。你可以尝试一些事情。

例如,不要使用if(ok == false)尝试使用while(ok == false),这样如果某些事情导致它提前返回(总是很好的练习),它会重复等待。还要考虑一个线程运行多长时间没有一致性 - 例如,完全有可能thread1在从等待返回后立即产生,这会给你带来一些不可预测的结果......试试发布会发生什么所以我们可以更详细地研究它。

另外,做什么janm说;)