【发布时间】:2011-12-23 05:33:12
【问题描述】:
当我运行此代码时,我会以相反的顺序获得线程消息。如果我创建线程 A 和 B,则 A 的 msg 应该首先出现,然后是 B。同样,如果我创建一个包含 10 个线程的数组,则 msg 应该按顺序打印。如果存在任何同步问题,则消息不应在所有情况下都显示相同的反向行为。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/* Required for thread APIs */
#include <pthread.h>
#define NTHREADS 10
int counter = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *print_thread_msg(void *ptr){
char *message;
printf("Thread number %ld\n", pthread_self());
pthread_mutex_lock(&mutex);
counter++;
printf("Counter value: %d\n",counter);
message = (char *) ptr;
printf("%s \n",message);
sleep(1);
pthread_mutex_unlock(&mutex);
message = (char *) ptr;
printf("%s \n",message);
}
int main (void){
pthread_t threadA, threadB;
pthread_t thread_id[NTHREADS];
int i,j;
char *msgA = "I am thread A";
char *msgB = "I am thread B";
pthread_create(&threadA, NULL, print_thread_msg, (void *)msgA);
pthread_create(&threadB, NULL, print_thread_msg, (void *)msgB);
for(i=0; i<NTHREADS; i++)
pthread_create(&thread_id[i], NULL, print_thread_msg, (void *)"print_thread_msg");
pthread_join(threadA, NULL);
pthread_join(threadB, NULL);
for(j=0; j < NTHREADS; j++)
pthread_join(thread_id[j], NULL);
printf(" Finally Counter Value : %d\n",counter);
exit(0);
}
【问题讨论】:
-
这里没有错。这是预期的行为,因为线程是不确定的,并且您受调度程序的支配。您无法预测它们何时运行或订单。当我运行你的 pgm 5 时,你的十个“print_thread_msg”线程在 A 或 B 之前运行。每次运行都可能不同。
-
我认为你是对的。当我在其他系统上运行相同的程序时,它可以正确打印。