多线程编程
下木
关注分布式计算,操作系统以及计算机体系结构. 微博:http://weibo.com/u/2120698533
展开
-
【pthread系列-7】条件变量的接口函数和使用原则
条件变量的接口、常量、数据类型1.静态创建一个条件变量(栈)pthread_cond_t cond;2.动态创建一个条件变量(堆)pthread_cond_t * pCond = (pthread_cond_t *)malloc(sizeof(pthread_cond_t));3.初始化静态条件变量(默认方式)使用宏 PTHREAD_COND_INITIALIZER4.原创 2013-02-27 11:09:38 · 519 阅读 · 0 评论 -
【pthread系列-10】pthread的属性对象
1.概述属性对象是为对象初始化提供额外参数的容器。可以简单的将属性对象想象为一个结构体,不过这个结构体的变量的读写需要通过提供的函数而不是用成员访问符直接操作其成员变量。属性对象具体可以实现为结构体的栈变量,然后将访问函数包装为各种宏。还可以实现为堆变量,然后使用真正的函数进行访问,这样的实现还可以进行有效性检查等其他功能。POSIX中的属性对象有pthread_t对应的属性对象pthre原创 2013-02-27 11:10:04 · 580 阅读 · 0 评论 -
【pthread系列-8】POSIX线程中的“一次初始化”
1.核心接口函数pthread_once_t once_control = PTHREAD_ONCE_INIT;int pthread_once(pthread_once_t * once_control,void (*init_routin)(void));2.问题和解决方案在正式开始进行计算之前,通常需要完成一些初始化工作,而且这些初始化在程序启动之后只允许进行一次。如果有主函原创 2013-02-27 11:09:54 · 611 阅读 · 0 评论 -
【pthread系列-6】条件变量基本概念和原理
条件变量的作用是用于多线程之间关于共享数据状态变化的通信。当一个动作需要另外一个动作完成时才能进行,即:当一个线程的行为依赖于另外一个线程对共享数据状态的改变时,这时候就可以使用条件变量假设没有条件变量,对于一个生产者消费者问题,消费线程在得知队列中没有产品时,将阻塞自己。生产线程给队列中放入产品,但是没有办法激活消费线程,而消费线程处于阻塞状态也没有办法自激活。如果消费线程使用忙等的方式,通原创 2013-02-27 11:09:36 · 702 阅读 · 0 评论 -
【pthread系列-5】Pthreads线程的基本常识
1.Pthreads中线程的接口函数与线程相关的头文件为pthread.h,编译时要连接的库为pthread。pthread_t thread;线程的数据类型为pthread_t。int pthread_equal(pthread t1,pthread t2);判断两个线程标识符是不是代表的是同一个线程。线程标识符只有相等和不等的关系,没有大小关系。int pthread_原创 2013-02-27 11:09:32 · 736 阅读 · 0 评论 -
【pthread系列-2】检查Pthreads函数的返回值
一定要检查函数的返回值 《C/C++软件测试规范》上有很重要的一条就是要检查所有返回值不为空的函数的返回值来判断库函数或者系统调用的执行是否成功。如果读一些经典开源代码,你会发现几乎每一个函数的调用都会被放置在一个if语句中来检查被调用函数的执行情况。经常会看到超市收银台的电脑上或者学校的自助充值终端甚至是火车站购票的大屏幕上会弹出Windows的对话框显示“0xXXXXXXXX原创 2013-02-27 11:09:24 · 581 阅读 · 0 评论 -
【pthread系列-1】同步异步线程进程的一些思考
同步与异步 同步与异步在生活中随处可见。同步和异步是描述不同事件发生的依赖关系,同步是指这两个事件的发生有一定的时间顺序,异步是指这两个事件的发生是相互独立的。 比如去食堂吃饭,你需要先去那餐具(事件A),然后去某个窗口前打饭(事件B),接着找到一个座位(事件C),最后开始享受食物(事件D)。事件A,B,C,D有一定的依赖关系,所以它们之间需要同步。处理器中的取指、译码、执行、原创 2013-02-27 11:09:21 · 858 阅读 · 0 评论 -
【pthread系列-9】pthread_mutex_t的静态初始化
初始化phtread_mutex_t类型的变量时有两种方法:一种为使用宏PTHREAD_MUTEX_INITIALIZER进行初始化,另外一种是使用函数pthread_mutex_init函数。第一种方法仅局限于静态初始化的时候使用:将“声明”、“定义”、“初始化”一气呵成,除此之外的情况都只能使用pthread_mutex_init函数。下面是一段很简单的测试代码: /* * m原创 2013-02-27 11:09:55 · 1098 阅读 · 0 评论 -
【pthread系列-4】使用多线程的利弊
1.Amdahl定律 一个很简单的量化公式,用来计算一个程序中串行部分所占多少对程序加速比的影响或者用来计算计算机硬件配置中某个设备的速度提高能够将整个系统的速度提高多少。 假设一个串行程序执行的总时间为1,不能被并行化的部分占的时间比例为p,即串行化的部分为p,可并行化的时间为:1-p。如果用n个核用来加速的话,加速比为: 如果一个程序中只有50%部原创 2013-02-27 11:09:29 · 663 阅读 · 0 评论 -
【pthread系列-3】一个定时器的普通实现,多进程实现和多线程实现的对比
要求实现一个简单的定时器,该程序要求的输入格式为:N prompt message其中N表示时间,prompt message表示提示信息。即过了N秒之后要在终端上显示出提示信息。一共用了三种方式实现:(1)最普通的方式,阻塞I/0+同步。(2)使用进程实现。(3)使用线程实现。 /*alarm.c*/ #include "../error.h" #include int m原创 2013-02-27 11:09:26 · 945 阅读 · 0 评论 -
【pthread系列-11】对Pthread线程进行简单的类封装
1.封装遇到的问题 将Pthreads线程封装为抽象类,这样用户在使用线程时,只需要继承一下这个抽象类,并实现相应的接口就可以了。这样做的好处是用户可以将注意力集中在线程所要执行的逻辑上,而不需要关注创建线程、销毁线程等细节问题上。这里给出两种简单的封装方法,以供参考。 我们抽象类的名称为Thread,其中有一个成员函数run,该函数为的声明形式为:原创 2013-02-27 11:10:06 · 636 阅读 · 0 评论