Linux多线程编程-信号量
在Linux中。信号量API有两组。一组是多进程编程中的System V IPC信号量。另外一组是我们要讨论的POSIX信号量。
这两组接口类似,但不保证互换。POSIX信号量函数都已sem_开头,并不像大多数线程函数那样以pthread_开头。经常使用的有下面5个:
#include <semaphore.h>
int sem_init(sem_t* sem, int pshared, unsigned int value);
int sem_destroy(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem);
这些函数的第一个參数sem指向被操作的信号量。上面这些函数成功时返回0。失败返回-1并设置errno。
l sem_init函数用于初始化一个未命名的信号量(POSIX信号量API支持命名信号量,只是在该章节没有讨论)。pshared制定信号量的类型,假设其值为0,则表示这个信号量是当前进程的局部信号量。否则信号量就能够在多个进程之间共享。value制定信号量的初始值,此外初始化一个已经被初始化的信号量将导致不可预期的后果
l sem_destroy用于销毁信号量,以释放其占用的内核资源。
假设销毁一个正在等待的信号量。则将导致不可预期的后果
l sem_wait以原子操作将信号量值减1,假设信号量的值为0,则sem_wait将被堵塞,直到该信号量值为非0值
l sem_trywait与sem_wait函数类似。只是它始终马上返回,而不论信号量是否具有非0值,相当于sem_wait的非堵塞版本号。当信号量的值为非0时。sem_trywait对信号量运行减1操作;当信号量为0时。它将返回-1并设置errno为EAGAIN
l sem_post以原子操作的方式将信号量的值加1。当信号量的值大于0时,其它正在调用sem_wait等待信号量的线程将被唤醒
线程中使用信号量演示样例:
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h> #define err_sys(msg) \
do { perror(msg); exit(-1); } while(0)
#define err_exit(msg) \
do { fprintf(stderr, msg); exit(-1); } while(0) void *r1(void *arg)
{
sem_t* sems = (sem_t *)arg;
static int cnt = 10; while(cnt--)
{
sem_wait(sems);
printf("I am in r1. I get the sems.\n");
}
} void *r2(void *arg)
{
sem_t* sems = (sem_t *)arg;
static int cnt = 10; while(cnt--)
{
printf("I am in r2. I send the sems\n");
sem_post(sems);
sleep(1);
}
} int main(void)
{
sem_t sems;
pthread_t t1, t2; printf("sems size: %d\n", sizeof(sems));
/* sem_init()第二个參数为0表示这个信号量是当前进程的局部信号量。否则该信号
* 就能够在多个进程之间共享 */
if(sem_init(&sems, 0, 0) < 0)
err_sys("sem_init error");
pthread_create(&t1, NULL, r1, &sems);
pthread_create(&t2, NULL, r2, &sems); pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_destroy(&sems); return 0;
}
參考:
1、《Linux高性能server编程》第14章 多线程编程/信号量
Linux多线程编程-信号量的更多相关文章
- Linux多线程编程小结
Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序 ...
- ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程
为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用 (2009-10-27 11:07:23) 转载▼ 标签: 杂谈 分类: 计算机 举一个例子(http:// ...
- Linux多线程编程阅读链接
1. 进程与线程的一个简单解释(阮一峰) 2. linux 多线程编程 3. Linux 的多线程编程的高效开发经验 (IBM)
- Linux多线程编程和Linux 2.6下的NPTL
Linux多线程编程和Linux 2.6下的NPTL 在Linux 上,从内核角度而言,基本没有什么线程和进程的区别--大家都是进程.一个进程的多个线程只是多个特殊的进程他们虽然有各自的进程描述结构, ...
- Linux多线程编程初探
Linux线程介绍 进程与线程 典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情.有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程 ...
- 【操作系统作业-lab4】 linux 多线程编程和调度器
linux多线程编程 参考:https://blog.csdn.net/weibo1230123/article/details/81410241 https://blog.csdn.net/skyr ...
- Linux多线程编程实例解析
Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...
- Linux多线程编程之详细分析
线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我见到这样一道面试题: 是否熟悉POSIX多线程 ...
- Linux下多线程编程-信号量
今天来谈谈线程的同步--信号量. 首先来看看一些概念性的东西: 如进程.线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行:B依言执行,再将结果给 ...
随机推荐
- (转载)django 访问url报错Forbidden (CSRF cookie not set.): xxx 问
原地址:http://www.cnblogs.com/meitian/p/7016336.html 问题:页面访问时报错 Forbidden (CSRF cookie not set.): xxx ...
- Java的代码转C#
推荐个网站:点击打开链接 细节上有些小问题
- mysql物理备份恢复 xtrabackup 初试
听闻xtrabackup开源且强大 2018-03-06 11:54:41 在官网下载安装了最新的2.4.9版本 网上文章都用的innobackupex,但是最新版已经抛弃了,自己看看手册<Pe ...
- SQL语句操作符优化
转载地址:http://database.51cto.com/art/200903/112810.htm IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. ...
- Mysql实战之数据备份
author:JevonWei 版权声明:原创作品 blog:http://119.23.52.191/ --- 数据备份和恢复 mysqldump 冷备份单库(不会创建新库,需要手动创建并指定导入数 ...
- hihoCoder 第136周 优化延迟(二分答案+手写堆)
题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...
- 使用 Nginx 过滤网络爬虫
现在有许多初学者学习网络爬虫,但他们不懂得控制速度,导致服务器资源浪费.通过 Nginx 的简单配置,能过滤一小部分这类爬虫. 方法一:通过 User-Agent 过滤 Nginx 参考配置如下: l ...
- CCC2019游记
好吧其实是清华游记,$CCC2019$ 在中国只有北京和天津举办,要选去加拿大的人很少,估计是最近两国关系有点紧张的缘故吧 但实际上是某些已经被清华钦点的人去预览一下他们未来的栖息所 $13:30$ ...
- photoshop 安装
Photoshop 下载: http://www.duote.com/soft/54352.html 下载完后解压选择..\Adobe CS6\Set-up.exe ,点击 Set-up.exe ...
- modeJS 深了解(1): Node.js + Express 构建网站预备知识
转载:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp1.html 目录 前言 新建express项目并自定义路由规则 如何提取页面中的 ...