1. 程式人生 > >編寫一個程式,開啟3個執行緒,這3個執行緒的ID分別為A、B、C,每個執行緒將自己的ID在螢幕上列印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC….依次遞推。

編寫一個程式,開啟3個執行緒,這3個執行緒的ID分別為A、B、C,每個執行緒將自己的ID在螢幕上列印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC….依次遞推。

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define NUM 10

pthread_mutex_t mutex;

pthread_cond_t conda;
pthread_cond_t condb;
pthread_cond_t condc;

int floga = 0;
int flogb = 0;
int flogc = 0;

void *thread_a(void *argv)
{
	int i = 0;
	char *p;
	p = (char *)argv;
	//printf("%s",p);
	while(i < NUM)
	{
		pthread_mutex_lock(&mutex);
		floga = 1;
		pthread_cond_wait(&conda,&mutex);
		floga = 0;
		//pthread_mutex_unlock(&mutex);
		printf("%s",p);
		while(!flogb)
		{
		    pthread_mutex_unlock(&mutex);
			sleep(10);
		    pthread_mutex_lock(&mutex);
		}
		pthread_cond_signal(&condb);
		pthread_mutex_unlock(&mutex);
		i++;
	}
	floga = 1;
}

void *thread_b(void *argv)
{
	int i;
	char *p;
	p = (char *)argv;
	//printf("%s",p);
	while(i < NUM)
	{
		pthread_mutex_lock(&mutex);
		flogb = 1;
		pthread_cond_wait(&condb,&mutex);
		flogb = 0;
		//pthread_mutex_unlock(&mutex);

		printf("%s",p);
		while(!flogc)
		{
			pthread_mutex_unlock(&mutex);
			sleep(10);
			pthread_mutex_lock(&mutex);
		}
		pthread_cond_signal(&condc);
		pthread_mutex_unlock(&mutex);
		i++;
	}

}

void *thread_c(void *argv)
{
	int i;
	char *p;
	p = (char *)argv;
	//printf("%s",p);
	while(i < NUM)
	{
		pthread_mutex_lock(&mutex);
		flogc = 1;
		pthread_cond_wait(&condc,&mutex);
		flogc = 0;
		//pthread_mutex_unlock(&mutex);

		printf("%s",p);
		while(!floga)
		{
			pthread_mutex_unlock(&mutex);
			sleep(10);
			pthread_mutex_lock(&mutex);
		}
		pthread_cond_signal(&conda);
		pthread_mutex_unlock(&mutex);
		i++;
	}
}

int main()
{
	pthread_t A;
	pthread_t B;
	pthread_t C;
	int ret;
	char *pa = "A";
	char *pb = "B";
	char *pc = "C";

	pthread_mutex_init(&mutex,NULL);
	pthread_cond_init(&conda,NULL);
	pthread_cond_init(&condb,NULL);
	pthread_cond_init(&condc,NULL);

	ret = pthread_create(&A,NULL,thread_a,(void *)pa);
	if(ret == -1)
	{
		printf("pthread_create a error!\n");
		exit(-1);
	}
	ret = pthread_create(&B,NULL,thread_b,(void *)pb);
	if(ret == -1)
	{
		printf("pthread_create a error!\n");
		exit(-1);
	}
	ret = pthread_create(&C,NULL,thread_c,(void *)pc);
	if(ret == -1)
	{
		printf("pthread_create a error!\n");
		exit(-1);
	}
	sleep(2);
	pthread_cond_signal(&conda);

	pthread_join(A,NULL);
	//printf("\nfinished A!\n");
	pthread_join(B,NULL);
	//printf("\nfinished B!\n");
	pthread_join(C,NULL);
	//printf("\nfinished C!\n");
	printf("\nfinished!\n");

    return 0;
}