原文浏览:
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/
如果您想转载本博客,请注明出处
如果您对本文有意见或者建议,欢迎留言
分享到:
相关推荐
java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例
HttpClient多线程网络下载 经典案例源代码
《秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据》 http://blog.csdn.net/morewindows/article/details/8646902 配套程序 在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥...
常见的多线程经典面试题和答案,包含了面试中常见了多线程问题。
该文档是我总结的c++笔试面试通常会问的一些问题。另外可以从我的资源目录下找c++数据结构与算法,c++笔试面试基础两部分材料,综合这三个材料一起看,我相信大家一定尽快找到工作。
各大公司校招笔试面试多线程和并发历年真题总结,总共上百页吧。其他类目可以查看我上传的资源
Java多线程程序案例,很有帮助,很有用
经典嵌入式笔试题 8. 关键字volatile有什么含意?并给出三个不同的例子。 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个...
Java多线程常见面试题 31 Java企业面试题整理集合(1) 34 Java企业面试题整理集合(2) 43 Java企业面试题整理集合(3) 55 Java企业面试题整理集合(4) 62 Java企业面试题整理集合(5) 74 Java企业面试题整理集合(6) 85 ...
一个经典多线程调用,挂起,把怎样应用多线程讲述的很清楚.
教会你怎么用多线程。有多线程的案例,线程案例,多线程下载源代码Gdownload_V2.0
介绍多线程同步的基础知识 首先我要提一点,关于线程的基础知识,一个程序,即一个进程,可以有很多个线程,当然,至少要有一个线程,即主线程.相信大家都知道多线程的好处吧,举个书上的例子 吧,Windows在复制文件的时候,有...
多线程面试题
Java 多线程访问的经典例子,一个个代码 手动敲出,可以加深或理解 多线程访问 线程安全与同步的问题.
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等
很简单的一个java多线程例子,希望多大家有帮助
多线程,多线程面试题,C#源码.zip
线程这一知识点一直是困扰大家学习java的一个难点。此处笔者提供了其两个经典案例——生产者与消费者、同步两个操作者取钱问题的代码。供大家参考