原文浏览:
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多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...
这份“迅雷笔试题汇总整理”涵盖了多种IT领域的知识,旨在测试应聘者的综合素质和技术能力。以下是对这些知识点的详细解析: 1. **计算机网络**:迅雷的核心业务涉及网络传输,因此,网络基础知识是必不可少的,...
HttpClient多线程网络下载 经典案例源代码
【迅雷校园招聘笔试题】涉及的范围广泛,主要涵盖了计算机基础知识、网络技术、操作系统、数据结构与算法、软件工程等多个领域。以下是根据题目标题和描述可能涉及的一些知识点的详细说明: 1. 计算机基础知识:这...
尤其是在校招笔试面试中,对于理解多线程和并发的真题,往往是衡量一个程序员专业水平的重要指标。本文将详细探讨多线程和并发中的一些重要知识点,包括缓存一致性问题、volatile关键字的内存语义等,这些内容在各大...
在C++笔试面试中,网络和多线程是两个经常被提及的重要知识点。本篇文档详细列举了关于网络部分的面试题目,同时也涉及了与多线程相关的TCP/IP协议栈的建立和断开过程。以下为详细的知识点总结: 1. TCP服务创建...
本文总结了数字马力的笔试题,涵盖了软件测试岗位的简历筛选笔试题,涉及到了接口自动化测试、Java/Python 实现多线程的方法等知识点。 接口自动化测试 在软件测试中,接口自动化测试是一个重要的环节。它可以帮助...
这个“多线程终极案例程序”旨在帮助Java开发者深化对多线程的理解,通过一个具体的“多兵种联合攻击防御塔”游戏案例来实践。下面将详细解释该案例中的关键知识点。 首先,多线程是并发执行多个任务的能力,可以...
本案例中,我们将深入探讨两个经典线程问题——“生产者与消费者”模型和“同步两个操作者取钱问题”。 首先,我们来看“生产者与消费者”问题。这个问题是多线程编程中的一个典型应用场景,模拟了实际生产流水线的...
Java作为一门广泛使用的编程语言,其面试笔试题涵盖了众多领域,包括基础语法、面向对象、集合框架、多线程、异常处理、IO流、网络编程、数据库操作、设计模式、JVM优化等。以下是对这些知识点的详细阐述: 1. **...
Java 多线程访问的经典例子,一个个代码 手动敲出,可以加深或理解 多线程访问 线程安全与同步的问题.
【标题】"农行Java笔试题"涉及到的Java知识点涵盖了编程基础、面向对象特性、集合框架、多线程、异常处理、IO流、网络编程、数据库操作等多个领域,这些都是Java程序员必须掌握的核心技能。 首先,从编程基础角度来...
理解并熟练运用这些语言的特性,如内存管理、异常处理和多线程,将有助于解答相关题目。 二、图形学与物理引擎 游戏画面的呈现与物体运动的模拟是游戏开发的核心部分。考生需要了解OpenGL、DirectX等图形库的使用,...
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作为一门广泛使用的编程语言,其笔试题涵盖了基础语法、数据结构、算法、多线程、网络编程、设计模式等多个方面。本资料集合了大量Java笔试题,旨在帮助求职者全面复习并准备Java相关的笔试环节,同时包含了各大...
本案例"VB 多线程模块"着重于展示如何在VB中创建和管理多线程,以实现并发操作。 首先,VB中的多线程主要依赖于`System.Threading`命名空间,该命名空间提供了多种类来支持线程的创建和管理。其中,`Thread`类是...
很简单的一个java多线程例子,希望多大家有帮助
**Qt笔试题总结** Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面应用、嵌入式系统和移动设备。它提供了丰富的API,让开发者能够方便地创建美观且功能强大的用户界面。本总结将针对Qt笔试题中的...