4线程同步:信号量

简介: 1信号量 信号量可以有n把锁。 依赖的头文件 #include <semaphore.h> 函数声明 sem_t表示信号量   int sem_init(sem_t *sem, int pshared,unsigned int value); 名称: sem_init 功能:

1信号量

信号量可以有n把锁。

依赖的头文件

#include <semaphore.h>

函数声明

sem_t表示信号量

 

int sem_init(sem_t *sem, int pshared,unsigned int value);

名称:

sem_init

功能:

initialize an unnamed semaphore,初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享

头文件:

#include <semaphore.h>

函数原形:

int sem_init(sem_t *sem, int pshared, unsigned int value);

参数:

 

返回值:

sem_init() returns 0 on success; on error, -1 is returned, and errno is set to indicate the error.

 

int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);

名称:

sem_wait

sem_trywait

功能:

lock a semaphore 一直阻塞等待直到信号量 > 0.

头文件:

#include <semaphore.h>

函数原形:

int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);

参数:

 

返回值:

All of these functions return 0 on success; on error, the value of the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error.

 

int sem_timedwait(sem_t *sem, const structtimespec *abs_timeout);

名称:

sem_timedwait

功能:

lock a semaphore,阻塞等待若干时间直到信号量 > 0

头文件:

#include <semaphore.h>

函数原形:

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

参数:

 

返回值:

All of these functions return 0 on success; on error, the value of the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error.

 

int sem_post(sem_t *sem);

名称:

sem_post

功能:

unlock a semaphore,使信号量加1

头文件:

#include <semaphore.h>

函数原形:

int sem_post(sem_t *sem);

参数:

 

返回值:

sem_post() returns 0 on success; on error, the value of the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error.

 

int sem_destroy(sem_t *sem);

名称:

sem_destroy

功能:

destroy an unnamed semaphore释放信号量。和sem_init对应

头文件:

#include <semaphore.h>

函数原形:

int sem_destroy(sem_t *sem);

参数:

 

返回值:

sem_destroy() return 0 on success;on error,-1 is returned,an errno is set to indicate the error.

案例说明:

#include <stdlib.h>

#include <pthread.h>

#include <stdio.h>

#include <unistd.h>

#include <semaphore.h>

 

#define NUM 5

 

int queue[NUM];

sem_t blank_number,product_number;

 

void *producer(void *arg)

{

   int p = 0;

   while(1) {

       //blank_num = 5生产者最多生产5

       //一直阻塞等待信号量大于0

       sem_wait(&blank_number);

       queue[p] = rand() % 1000 + 1;

       printf("Produce %d\n",queue[p]);

       //product_number = 0 ->1

       //使信号量加1

       sem_post(&product_number);

       p = (p + 1) % NUM;

       sleep(rand() % 5);

   }

}

 

void *consumer(void *arg) {

   int c = 0;

   while (1) {

       //等待信号量大于0

       sem_wait(&product_number);

       printf("Consume %d\n",queue[c]);

       queue[c] = 0;

       //使信号量加1

       sem_post(&blank_number);

       c = (c + 1) % NUM;

       sleep(rand() % 5);

   }

}

int main(int argc ,char *argv[])

{

   pthread_t pid,cid;

   //blank_num信号量初始化的值为5

   sem_init(&blank_number,0,NUM);

   //product_number信号量初始化的值变为0

   sem_init(&product_number,0,0);

   pthread_create(&pid,NULL,producer,NULL);

   pthread_create(&cid,NULL,consumer,NULL);

   pthread_join(pid,NULL);

   pthread_join(cid,NULL);

   sem_destroy(&blank_number);

   sem_destroy(&product_number);

   return 0;

}

运行结果:


目录
相关文章
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
213 2
利用信号量实现线程顺序执行
【8月更文挑战第24天】本文介绍了如何运用信号量确保多线程程序中线程按预定顺序执行的方法。信号量作为同步机制,可有效控制共享资源访问,防止数据不一致。实现步骤包括:引入必要的头文件(如 `&lt;pthread.h&gt;` 和 `&lt;semaphore.h&gt;`),定义信号量变量(如 `sem_t` 类型),初始化信号量(通常第一个信号量设为1,其余设为0),以及创建线程(每个线程执行特定任务并释放相应信号量)。
207 1
|
安全 C++
利用信号量实现线程顺序执行
【8月更文挑战第25天】信号量是多线程编程中用于控制共享资源访问的关键同步机制,能有效保证线程按预设顺序执行。实现方法包括:引入相关头文件(如 C++ 中的 `&lt;semaphore.h&gt;`),创建信号量并通过 `sem_init` 设置初始值;在各线程函数中运用 `sem_post` 与 `sem_wait` 来传递执行权;最后,通过 `sem_destroy` 销毁信号量以释放资源。使用过程中需注意错误处理、确保线程安全及合理设定信号量初值,以维持程序稳定性和高效性。
201 1
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
391 0
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
127 1
|
安全 Java API
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
142 4
|
监控 Cloud Native Java
通用快照方案问题之Hystrix和Ribbon在超时设置上的冲突如何解决
通用快照方案问题之Hystrix和Ribbon在超时设置上的冲突如何解决
223 0
|
算法 安全 Unix
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
470 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
128 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)

热门文章

最新文章