Linux 多线程编程: 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码

pp__qq 发布于 2014/05/23 22:00
阅读 1K+
收藏 1

我的代码如下:

pthread_mutex_t mutex;
pthread_cond_t cond;

enum  Statu{ Main=0,Son=1,ThreadNum };
Statu Running=Son;/* 其值若为 Main,则表明 Main 开始运行. */
const int loop_times=50;

void* son_thread(void *){
	pthread_mutex_lock(&mutex);
	for(int ci=0;ci<loop_times;){
		if(Running==Son){
			for(int cj=0;cj<10;++cj) ;
			Rep("%d: 子线程循环 10 次",ci);
			Running=Main;
			++ci;
		}
		pthread_cond_signal(&cond);
		pthread_cond_wait(&cond,&mutex);
	}
	pthread_mutex_unlock(&mutex);
	pthread_cond_signal(&cond);
	pthread_exit(NULL);
}

void* main_thread(void *){
	pthread_mutex_lock(&mutex);
	for(int ci=0;ci<loop_times;){
		if(Running==Main){
			for(int cj=0;cj<100;++cj);
			Rep("%d: 主线程运行 100 次",ci);
			Running=Son;
			++ci;
		}
		pthread_cond_signal(&cond);
		pthread_cond_wait(&cond,&mutex);
	}
	pthread_mutex_unlock(&mutex);
	pthread_cond_signal(&cond);
	pthread_exit(NULL);
}

int main(int argc,char *argv[]){
	pthread_cond_init(&cond,NULL);
	pthread_mutex_init(&mutex,NULL);

	pthread_t threads[ThreadNum];
	pthread_create(&threads[Main],NULL,main_thread,NULL);
	pthread_create(&threads[Son],NULL,son_thread,NULL);
	pthread_join(threads[Main],NULL);
	pthread_join(threads[Son],NULL);
	return 0;
}



运行结果也是正确的,可我总感觉代码不怎么好,所以有没有人能给我一个好的答案.谢谢.

加载中
0
pp__qq
pp__qq

我觉得下面的代码还好.

enum Thread{Main=0,Son,ThreadNum};
namespace{
pthread_mutex_t mutex;
pthread_cond_t cond;
Thread Running=Son;/* 当前运行线程 */
}

void* thread_2_func(void *arg){
	Thread next_thread[]={Son,Main};	/* 下一个该运行的线程 */
	Thread cur_thread=(Thread)(long)arg;	/* 当前线程的标识,主线程,子线程 */
	int loop_times[]={100,10};/* 循环次数,主线成 100 次. */
	int sum_loop_times=50;	/* 总循环次数 */

	(pthread_mutex_lock(&mutex));
	for(int ci=0;ci<sum_loop_times;){
		if(Running==cur_thread){
			for(int cj=0;cj<loop_times[cur_thread];++cj);
			Rep("%d: 循环 %d 次",ci,loop_times[cur_thread]);
			Running=next_thread[cur_thread];
			++ci;
		}
		(pthread_cond_signal(&cond));
		if(ci==sum_loop_times)	/* 已经完成了最后一次循环,不再需要 */
			pthread_mutex_unlock(&mutex);
		else
			pthread_cond_wait(&cond,&mutex);
	}
	pthread_exit(NULL);
}

int main(int argc,char *argv[]){
	pthread_cond_init(&cond,NULL);
	pthread_mutex_init(&mutex,NULL);

	pthread_t threads[ThreadNum];
	pthread_create(&threads[Main],NULL,thread_2_func,(void*)(long)Main);
	pthread_create(&threads[Son],NULL,thread_2_func,(void*)(long)Son);
	pthread_join(threads[Main],NULL);
	pthread_join(threads[Son],NULL);
}



0
c
chen90

题目说的主线程,我理解应该就是main线程,所以应该只需要pthread_create一个线程

返回顶部
顶部