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

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

#include

#include

#include

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( * * ); //2 seconds

sem_post(&g_semt);

static char* pRet = "thread finished! \n";

return pRet;

}

int main()

{

const size_t nThreadCount = ; //amounts of thread array

const unsigned int nSemaphoreCount = ; //initial value of semaphore

int nRet = -;

void* pRet = NULL;

pthread_t threadIDs[nThreadCount] = {};

nRet = sem_init(&g_semt, , nSemaphoreCount);

if ( != nRet)

return -;

for (size_t i = ; i < nThreadCount; ++ i)

{

nRet = pthread_create(&threadIDs[i], NULL, work_thread, NULL);

if ( != nRet)

continue;

}

for (size_t i = ; 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 ;

}

4、执行情况

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

718b50d2834ac48d76d2c82bf14fc88b.png

linux系统编程--线程同步

同步概念 所谓同步,即同时起步,协调一致.不同的对象,对“同步”的理解方式略有不同. 如,设备同步,是指在两个设备之间规定一个共同的时间参考: 数据库同步,是指让两个或多个数据库内容保持一致,或者按需 ...

Linux系统编程 —线程同步概念

同步概念 同步,指对在一个系统中所发生的事件之间进行协调,在时间上出现一致性与统一化的现象. 但是,对于不同行业,对于同步的理解略有不同.比如:设备同步,是指在两个设备之间规定一个共同的时间参考:数据 ...

&lbrack;C&plus;&plus;&rsqb; socket - 4 &lbrack;线程同步 简单例子&rsqb;

/*WINAPI 线程同步*/ #include #include DWORD WINAPI myfun1(LPVOID lpParam ...

Linux多线程及线程同步简单实例

一.多线程基本概念 1. 线程的基本概念 ① 线程就是轻量级的进程 ②线程和创建他的进程共享代码段.数据段 ③线程拥有自己的栈 2. 在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互 ...

【Linux】Mutex互斥量线程同步的例子

0.互斥量  Windows下的互斥量 是个内核对象,每次WaitForSingleObject和ReleaseMutex时都会检查当前线程ID和占有互斥量的线程ID是否一致. 当多次Wait**时就 ...

Delphi多线程的OnTerminate属性(附加一个关于临界区线程同步的例子)

首先看TThread源码中关于OnTerminate的代码: public .... property OnTerminate: TNotifyEvent read FOnTerminate writ ...

linux Posix 信号量 三 (经典例子)

本文将阐述一下信号量的作用及经典例子,当中包括“寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等 首先,讲 semWait操作(P操作)和semSig ...

linux中的线程同步:生产者、消费者问题

#include #include #include #include

线程同步 –Mutex和Semaphore

上一篇介绍了同步事件EventWaitHandle,以及它的两个子类型AutoResetEvent和ManualResetEvent.下面接着介绍WaitHandle的另外两个子类型Mutex和Sem ...

随机推荐

I&sol;O Directory类

Directory类 Directory类位于System.IO 命名空间.Directory类提供了在目录和子目录中进行创建移动和列举操作的静态方法.此外,你还可以访问和操作各种各样的目录属性. 1 ...

【洛谷P3398】仓鼠找sugar

画个图就能多少看出些规律 证明借鉴一下大牛的题解: 设从A到B,经过的深度最小的点为X 同理,C,D的为Y 题目是一个点从A出发到B 一个从C出发到D 那么从A到B可以分解成 先从A到X 再从X到B. ...

HTML&plus;CSS学习笔记 &lpar;7&rpar; - CSS样式基本知识

HTML+CSS学习笔记 (7) - CSS样式基本知识 内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌 ...

用css制作三角形

用css制作三角形,主要是利用css元素给“盒模型”设置边框得到的. 上图,上边框和做边框,以及上边框和右边框的交合处,浏览器会按照直角的二分之一处绘制交合线.这是“盒模型”有宽和高时候的效果.我们假 ...

&lbrack;Redux&rsqb; Adding React Router to the Project

We will learn how to add React Router to a Redux project and make it render our root component. Inst ...

C&plus;&plus; int转string

一.使用atoi 说明: itoa(   int   value,   char   *string,   int   radix   );       第一个参数:你要转化的int;       第 ...

Java 8 新特性终极版

声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...

并发编程(一):从头到脚解读synchronized

一.目录 1.多线程启动方式 2.synchronized的基本用法 3.深度解析synchronized 4.同步方法与非同步方法是否能同时调用? 5.同步锁是否可重入(可重入锁)? 6.异常是否会 ...

IP地址分类百科

IP地址分类介绍 这里讨论IPv4,IP地址分成了A类.B类.C类.C类.E类,如下图所示: 解释: A类以0开头,网络地址有7位,主机地址有24位,举例:A类地址:0 10000000 000000 ...

清北学堂4&period;28Day1(重大更新详见贪心例一)

枚举 用题目中给定的检验条件判定哪些是无用的,哪些是有用 的.能使命题成立的即为其解 . 例一 一棵苹果树上有n个苹果,每个苹果长在高度为Ai的地方.小明的身高为x 他想知道他最多能摘到多少苹果 数据 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值