我有三个线程,我想序列化 我使用的是pthreads是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
........
........
这是我正在使用的代码。它有时挂起,有时会运行一个或两个循环,然后挂起。我想听听你认为的问题。
我的代码是:
thread_test.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);
}
要编译代码,我使用
g++ -lpthread -std=gnu++0x thread_test.cpp
答案 0 :(得分:7)
我认为问题是pthread_cond_signal()
可以自由选择它想要的等待线程,而你的代码依赖于它选择一个特定的线程。
如果我将pthread_cond_signal()
替换为pthread_cond_broadcast()
,我将无法再停止代码。我提到这是一个观察;我还没有说服自己这是一个正确的解决办法。
答案 1 :(得分:3)
不考虑为什么要将线程序列化到这个程度的问题,问题是如果有多个线程在等待条件,pthread_cond_signal( &cond )
可能只唤醒其中一个以检查条件(实际上这是预期的和通常所希望的行为 - 如果释放一个以上的服务员,那就更加意外了。)
例如,当thread_a()
设置condition = 1
时,它意图唤醒thread_b
。但是,thread_c
可能会在thread_b
的同时等待。使用pthread_cond_signal
,您无法控制thread_b
或thread_c
将被释放。
使用pthread_cond_broadcast( &cond )
唤醒所有服务员。
答案 2 :(得分:0)
三个条件变量,每个线程一个。线程A发出信号,一个线程B正在等待表示一个线程C等待的信号,谁发出一个线程A等待的信号......
但是,如果你只是连续运行它们,那么有三个并行工作的线程有什么用呢?
答案 3 :(得分:0)
你应该看一下:deadlocks