0
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
int token = 2; 
int value = 3; 
void * red ( void *arg ) { 
 int myid = * ((int *) arg); 
 pthread_mutex_lock( &mutex ); 
 while ( myid != token) { 
 pthread_cond_wait( &cond, &mutex ); 
 } 
 value = value + (myid + 3); 
 printf( "RED: id is %d \n", value); 
 token = (token + 1) % 3; 
 pthread_cond_broadcast( &cond ); 
 pthread_mutex_unlock( &mutex ); 
} 
void * blue ( void *arg ) { 
 int myid = * ((int *) arg); 
 pthread_mutex_lock( &mutex ); 
 while ( myid != token) { 
 pthread_cond_wait( &cond, &mutex ); 
 } 
 value = value * (myid + 2); 
 printf( "BLUE: id is %d \n", value); 
 token = (token + 1) % 3; 
 pthread_cond_broadcast( &cond ); 
 pthread_mutex_unlock( &mutex ); 
} 
void * white ( void *arg ) { 
 int myid = * ((int *) arg); 
 pthread_mutex_lock( &mutex ); 
 while ( myid != token) { 
 pthread_cond_wait( &cond, &mutex ); 
 } 
 value = value * (myid + 1); 
 printf( "WHITE: id is %d \n", value); 
 token = (token + 1) % 3; 
 pthread_cond_broadcast( &cond ); 
 pthread_mutex_unlock( &mutex ); 
} 

main( int argc, char *argv[] ) { 
 pthread_t tid; 
 int count = 0; 
 int id1, id2, id3; 
 id1 = count; 
 n = pthread_create( &tid, NULL, red, &id1); 
 id2 = ++count; 
 n = pthread_create( &tid, NULL, blue, &id2); 
 id3 = ++count; 
 n = pthread_create( &tid, NULL, white, &id3); 
 if ( n = pthread_join( tid, NULL ) ) { 
 fprintf( stderr, "pthread_join: %s\n", strerror( n ) ); 
 exit( 1 ); 
 } 
}

我只是在寻找关于输出内容的评论和/或注释。这是为了考试而提供的。这不是家庭作业,也不会用于任何类型的提交。我希望了解发生了什么。任何帮助是极大的赞赏。

4

1 回答 1

0

我将假设您知道锁、条件变量和等待的功能。基本上你有三个线程,每个线程调用 Red、Blue 和 White。Token本来是2,value本来是3。

当 id1 = 0 时调用 Red,但它会停留在调用 wait() 的 while 块中,直到 token = 0。

Blue 在 id3 = 1 时被调用,并将停留在名为 wait() 的 while 块中,直到令牌为 1。

White 在 id2 = 2 时被调用,并将停留在调用 wait() 的 while 块中,直到令牌为 2。

所以 White 将首先进入临界区,因为它是唯一一个不会进入 while 循环的部分。所以值 = 3 * ( 3 ) = 9; 令牌 = ( 3 ) % 3 = 0;

广播会唤醒每个等待的线程,但唯一会进入临界区的是红色。它为 12 的值增加了 3;令牌 = ( 1 ) % 3 = 1; 广播唤醒蓝色。

蓝色进入临界区。值 = 12 * 3;token = 2 (但不再重要了)。

这将是线程将执行的顺序,这是我假设测试真正要求的。然而,真正应该出现的只是:

白色是 9

这是因为只有一个 pthread_t tid。所以在 pthread_join(tid, NULL) 之后,它可以立即退出。如果您在每个 pthread_create() 中放置不同的 pthread_t,那么它们都会打印。

于 2013-05-13T21:41:42.963 回答