Linux多线程编程小结
作者:网络转载 发布时间:[ 2014/11/4 11:51:46 ] 推荐标签:操作系统 Linux 多线程编程
4.线程的同一时候运行
接下来,我们来编写一个程序,以验证两个线程的运行是同一时候进行的。当然,假设是在一个单处理器系统上,线程的同一时候运行须要靠CPU在线程之间的高速切换来实现了。
我们的程序须要利用一个原理:即除了局部变量外,全部其它的变量在一个进程中的全部线程之间是共享的。
在这个程序中,我们是在两个线程之间使用轮询技术,这样的方式称为忙等待,所以它的效率会非常低。在本文的兴许部分,我们将介绍一种更好的解决的方法。
以下的代码中,两个线程会不断的轮询推断flag的值是否满足各自的要求。
编译这个程序:
gcc -D_REENTRANT thread2.c -o thread2 –lpthread
执行这个程序:
$ ./thread2
121212121212121212
Waiting for thread to finish...
5.线程的同步
在上述演示样例中,我们?用轮询的方式在两个线程之间不停地切换是很笨拙且没有效率的实现方式,幸运的是,专门有一级设计好的函数为我们提供更好的控制线程运行和?问代码临界区的方法。
本小节将介绍两个线程同步的基本方法:信号量和相互排斥量。这两种方法非常类似,其实,它们能够互相通过对方来实现。但在实际的应用中,对于一些情况,可能使用信号量或相互排斥量中的一个更符合问题的语义,而且效果更好。
5.1用信号量进行同步
1.信号量创建
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
?数说明:
sem:信号量对象。
pshared:控制信号量的类型,0表示这个信号量是当前进程的局部信号量,否则,这个信号量能够在多个进程之间共享。
value:信号量的初始值。
2.信号量控制
#include <semaphore.h>
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
sem_post的作用是以原子操作的方式给信号量的值加1。
sem_wait的作用是以原子操作的方式给信号量的值减1,但它会等到信号量非0时才会?始减法操作。假设对值为0的信号量调用sem_wait,这个函数会等待,直到有线程添加了该信号量的值使其不再为0。
3.信号量销毁
#include <semaphore.h>
int sem_destory(sem_t *sem);
这个函数的作用是,用完信号量后对它进行清理,清理该信号量所拥有的资源。假设你试图清理的信号量正被一些线程等待,会收到一个错误。
与大多数Linux函数一样,这些函数在成功时都返回0。
以下编码实现输入字符串,统计每行的字符个数,以“end”结束输入:
编译这个程序:
gcc -D_REENTRANT thread2.c -o thread2 –lpthread
执行这个程序:
$ ./thread3
Input some text. Enter 'end' to finish
123
You input 3 characters
1234
You input 4 characters
12345
You input 5 characters
end
Waiting for thread to finish…
Thread join
通过使用信号量,我们堵塞了统计字符个数的线程,这个程序似乎对高速的文本输入和悠闲的暂停都非常适用,比之前的轮询解决方式效率上有了本质的提高。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Linux下开源的DDR压力测试工具曝Linux恶意软件:让树莓派设备挖掘数字货币linux系统中不同颜色的文件夹及根目录介绍软件测试工程师必知必会Linux命令Linux下DNS服务器配置如何成为不可替代的Linux运维工程师?详解Linux进程(作业)的查看和杀死Linux 日志定时轮询流程详解比特币勒索病毒不只Windows系统有,Linux版的来了Linux日志定时轮询流程详解Linux iommu和vfio概念空间解构Linux系统如何低于TCP洪水攻击Linux无损调整分区大小Linux下防火墙配置实例Linux使用Jexus托管Asp.Net Core应用程序Linux中引号的那些事

sales@spasvo.com