文档章节

【Linux】Semaphore信号量线程同步的例子

cuihao
 cuihao
发布于 2014/12/01 15:06
字数 444
阅读 42
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

 

0、 信号量

Linux下的信号量和windows下的信号量稍有不同。

 

Windows

Windows下的信号量有一个最大值和一个初始值,初始值和最大值可以不同。  而且Windows下的信号量是一个【内核对象】,在整个OS都可以访问到。

 

Linux

Linux下的信号量在创建的时候可以指定一个初始值,这个初始值也是最大值。 而且Linux下的信号量可以根据需要设置为是否是【进程间共享】的,如果不是进程间共享的则就是一个本进程局部信号量。

 

 1、相关API

int semt_init( semt_t* sem,     //a semaphore pointer
 int     pshared, //0 as a local semaphore of cuurent process, or the semaphore can be shared between mulit processes
 unsigned value   //the init value of this memaphore
 ) //minus ONE value of semaphore
int sem_wait(sem_t* sem); //add ONE value of semaphore
int sem_post(sem_t* sem); //destroy the semaphore
int sem_destroy(sem_t* sem); All the functions above Rerurn ZERO IF SUCCESS !

 

 

 

 

2、上代码

 这个demo创建了5个线程,信号量的初始值为2,即同时最多有2个线程可以获得获得信号量从而得到执行。

#include <iostream> #include <pthread.h> #include <unistd.h> #include <semaphore.h>
using namespace std; sem_t g_semt; void* work_thread(void* p) { pthread_t tID = pthread_self(); cout << "-------" << tID << " is waiting for a semaphore -------" << endl; sem_wait(&g_semt); cout << "-------" << tID << " got a semaphore, is Runing -------" << endl << endl; usleep(1000 * 1000 * 2);  //2 seconds
    sem_post(&g_semt); static char* pRet = "thread finished! \n"; return pRet; } int main() { const size_t nThreadCount = 5; //amounts of thread array
    const unsigned int nSemaphoreCount = 2; //initial value of semaphore
    int nRet = -1; void* pRet = NULL; pthread_t threadIDs[nThreadCount] = {0}; nRet = sem_init(&g_semt, 0, nSemaphoreCount); if (0 != nRet) return -1; for (size_t i = 0; i < nThreadCount; ++ i) { nRet = pthread_create(&threadIDs[i], NULL, work_thread, NULL); if (0 != nRet) continue; } for (size_t i = 0; i < nThreadCount; ++ i) { int nRet2 = pthread_join(threadIDs[i], &pRet); cout << endl << threadIDs[i] << " return value is " << (char*)pRet << endl; } cout << endl << endl; sem_destroy(&g_semt); return 0; }

 

 

 

   

 

 

4、执行情况

 编译 g++ -D_REENTRANT  -lpthread   semaphore.cpp  -g  -o  semaphore.out

 

 

 

  

cuihao

cuihao

粉丝 11
博文 103
码字总数 106528
作品 0
海淀
私信 提问
加载中
请先登录后再评论。
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.4K
16
首列固定的列表

实现特殊的表格(UITableView)效果:即表格中的首列固定不动,而每一行除了首列均可左右拖动,以展现每一行更多内容。 作者谭林江(@无法越狱的痛)说:去益盟面试回来,感觉聊得有点郁闷,...

匿名
2013/01/24
1.2K
0
硬实时操作系统--Raw OS

Raw-OS 起飞于2012年,Raw-OS志在制作中国人自己的最优秀硬实时操作系统。 Raw-OS 操作系统特性 内核最大关中断时间无限接近0us, s3c2440系统最大关中断时间实测0.8us。 支持idle任务级别的事...

jorya_txj
2013/03/19
6.2K
1
阿里云开放存储服务的C语言SDK--OSSC

OSSC(Aliyun Open Storage Service C SDK)为阿里云开放存储服务(OSS)提供了一套完整易用的C SDK。 OSSC完全采用C语言开发,并实现了类似面向对象的调用方式,遵循了良好的编码规范,目前O...

大卷卷
2012/10/22
4.5K
0
高性能异步网络服务框架--libgod

libGod是一个全异步+协程机制实现的网络库,适用于windows、linux、bsd等多种平台。内部使用IOCP、epoll、kqueue等系统调用管理事件机制,同时巧妙的利用协程,将复杂的异步逻辑转换为同步,...

libGod
2012/11/09
6.7K
6

没有更多内容

加载失败,请刷新页面

加载更多

内存泄漏和内存溢出

1. 内存泄漏和内存溢出的概念 内存溢出: 是指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存。 内存泄漏:是指程序运行过程中分配内存给临时变量,用完之后没有...

加油加油再加油
9分钟前
9
0
SpringMvc如何获得前台传来的值

之前控制器方法获得前台传来的值有三种方式: 1.通过HttpServletRequest: @RequestMapping(value="/index1")public String helloaction1(HttpServletRequest request){     Syste......

文文1
16分钟前
6
0
React Native常用第三方组件汇总

react-native-animatable 动画 react-native-carousel 轮播 react-native-countdown 倒计时 react-native-device-info 设备信息 react-native-fileupload 文件上传 react-native-icons 图标 ......

mdoo
36分钟前
8
0
troubleshoot之:用control+break解决线程死锁问题

简介 如果我们在程序中遇到线程死锁的时候,该怎么去解决呢? 本文将会从一个实际的例子出发,一步一步的揭开java问题解决的面纱。 死锁的代码 写过java多线程程序的人应该都知道,多线程中一...

flydean
37分钟前
19
0
无法打开与身份验证代理的连接 - Could not open a connection to your authentication agent

问题: I am running into this error of: 我遇到以下错误: $ git push heroku masterWarning: Permanently added the RSA host key for IP address '50.19.85.132' to the list of known ......

法国红酒甜
53分钟前
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部