原文浏览:
http://www.ibaiyang.org/2011/08/31/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%BB%8F%E5%85%B8%E6%A1%88%E4%BE%8B/
最近在网上看到迅雷笔试出的一道题,对于初学多线程的童鞋一定会有更多的体会,先分享给大家,其中不乏一些多线程的技术,我相信看了这个代码你一定会有很多心得,我当初就是,嘿嘿……..
#include <stdio.h> #include <stdlib.h> #include <eerror.h> #include <pthread.h> #define GROUP_COUNT 100 #define GROUP_SIZE 4 typedef struct { pthread_mutex_t mutex; pthread_cond_t cond; int index; } syn_obj_t; syn_obj_t syn_obj = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0 }; typedef struct { int flag; } elem_t; void * thread_routine(void *arg); int main(int argc, char** argv) { elem_t elems[GROUP_SIZE]; pthread_t pds[GROUP_SIZE]; int i; printf("syn_obj.index = %d\n", syn_obj.index); for (i = 0; i < GROUP_SIZE; i++) { elems[i].flag = i; if ( (pthread_create(&pds[i], NULL, thread_routine, &elems[i])) != 0 ) { perror("pthread create"); exit(-1); } } for (i = 0; i < GROUP_SIZE; i++) { pthread_join(pds[i], NULL); } pthread_mutex_destroy(&syn_obj.mutex); pthread_cond_destroy(&syn_obj.cond); printf("\nsyn_obj.index = %d\n", syn_obj.index); return 0; } void * thread_routine(void *arg) { elem_t *elem = (elem_t *)arg; int i; for (i = 0; i < GROUP_COUNT; i++) { pthread_mutex_lock(&syn_obj.mutex); while ( (syn_obj.index % GROUP_SIZE) != elem->flag ) { pthread_cond_wait(&syn_obj.cond, &syn_obj.mutex); } printf("%d", elem->flag); if ( 0 == (syn_obj.index+1) % GROUP_SIZE ) { printf("\t"); } syn_obj.index++; pthread_cond_broadcast(&syn_obj.cond); // may be cause deadlock // pthread_cond_signal(&syn_obj.cond); pthread_mutex_unlock(&syn_obj.mutex); // sleep(1); } return NULL; }
这个多线程实现的功能可以做到多线程中经常使用的模型 客户/生产模型,所以能够学到很多,这个代码的结果是
连续打印ABCABCABC….
-----------------打造高质量的文章 更多关注 把酒泯恩仇---------------
为了打造高质量的文章,请 推荐 一下吧。。。。谢谢了,请关注我后续的文章,会更精彩哦
请关注sina微博:http://weibo.com/baiyang26
把酒泯恩仇官方博客:http://www.ibaiyang.org 【推荐用google reader订阅】
把酒泯恩仇官方豆瓣:http://www.douban.com/people/baiyang26/
如果您想转载本博客,请注明出处
如果您对本文有意见或者建议,欢迎留言
本文介绍了一道来自迅雷笔试的多线程题目,通过C语言实现了一个典型的多线程模型——生产者/消费者模型。该模型利用了互斥锁和条件变量来协调多个线程之间的运行,确保了按特定顺序输出字符。

400

被折叠的 条评论
为什么被折叠?



