C++ 我无法使三条线排列整齐

C++ 我无法使三条线排列整齐,c++,c,multithreading,pthreads,mutex,C++,C,Multithreading,Pthreads,Mutex,我有三个线程要序列化 我使用的是Pc++是C++。我试图对输出进行排序,使其为{A,B,C,A,B,C,A,B,C,…}。我这样做是因为我有太多的线程,我想序列化。 我希望得到的结果是: Thread A Thread B Thread C Thread A Thread B Thread C Thread A Thread B Thread C Thread A Thread B Thread C ........ ........ 这就是我的代码。它有时挂起,有时运行一两个循环,然后挂起。

我有三个线程要序列化
我使用的是Pc++是C++。我试图对输出进行排序,使其为{A,B,C,A,B,C,A,B,C,…}。我这样做是因为我有太多的线程,我想序列化。 我希望得到的结果是:

Thread A
Thread B
Thread C
Thread A
Thread B
Thread C
Thread A
Thread B
Thread C
Thread A
Thread B
Thread C
........
........
这就是我的代码。它有时挂起,有时运行一两个循环,然后挂起。我想听听你对这个问题的看法。 我的代码是:
线程测试.cpp

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int condition = 0;
int count = 0;

void* thread_c( void * arg )
{
   while( 1 )
   {
      pthread_mutex_lock( &mutex );
      while( condition != 2 )
         pthread_cond_wait( &cond, &mutex );
      printf( "Thread C");
      condition = 0;
      pthread_cond_signal( &cond );
      pthread_mutex_unlock( &mutex );
   }

   return( 0 );
}

void* thread_b( void * arg )
{
   while( 1 )
   {
      pthread_mutex_lock( &mutex );
      while( condition != 1 )
         pthread_cond_wait( &cond, &mutex );
      printf( "Thread B" );
      condition = 2;
      pthread_cond_signal( &cond );
      pthread_mutex_unlock( &mutex );
   }

   return( 0 );
}

void*  thread_a( void * arg )
{
   while( 1 )
   {
      pthread_mutex_lock( &mutex );
      while( condition != 0 )
         pthread_cond_wait( &cond, &mutex );
      printf( "Thread A");
      condition = 1;
      pthread_cond_signal( &cond );      
      pthread_mutex_unlock( &mutex );
   }
   return( 0 );
}

int main( void )
{
    pthread_t  thread_a_id;
    pthread_create( &thread_a_id, NULL, &thread_a, NULL );
    pthread_t  thread_b_id;
    pthread_create( &thread_b_id, NULL, &thread_b, NULL );
    pthread_t  thread_c_id;
    pthread_create( &thread_c_id, NULL, &thread_c, NULL );
    int a = pthread_join(thread_a_id, NULL);
    int b = pthread_join(thread_b_id, NULL);
    int c = pthread_join(thread_c_id, NULL);
}

三个条件变量,每个线程一个。线程A表示线程B正在等待的一个线程,它表示线程C正在等待的一个线程,它表示线程A正在等待的一个线程


但是,如果您只打算串行运行三个线程,那么让它们并行工作又有什么用呢?

我认为问题在于
pthread\u cond\u signal()
可以自由选择它想要的任何等待线程,而您的代码则取决于它选择一个特定的线程


如果我将
pthread\u cond\u signal()
替换为
pthread\u cond\u broadcast()
,我将无法再让代码暂停。我说这是一种观察;我还没有说服自己这是一个正确的修复方法。

您应该研究一下:

抛开为什么要将线程序列化到这种程度的问题不谈,问题是如果有多个线程在等待该条件,
pthread\u cond\u signal(&cond)
可能只会唤醒其中一个线程来检查该条件(事实上,这是预期的,通常是期望的行为——如果超过一名服务员被释放,那更像是一场意外)

例如,当
线程a()时
设置
condition=1
它打算唤醒
thread\u b
。但是,
thread\u c
可能与
thread\u b
同时等待。使用
pthread\u cond\u信号
您无法控制将释放
thread\u b
thread\u c
中的哪一个


使用
pthread\u cond\u广播(&cond)
而不是叫醒所有服务员。

我有三个线程要序列化-为什么?我有三个以上的线程。我有一个控制线程控制所有这些线程。我使用内核信号来同步所有线程。问题是内核信号很慢,与线程一起使用效率不高。所以我是tr下面的问题可以帮助你:虽然这可以从理论上回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。
g++ -lpthread -std=gnu++0x thread_test.cpp