博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LINUX信号量实现对公共数据的读写
阅读量:5901 次
发布时间:2019-06-19

本文共 1768 字,大约阅读时间需要 5 分钟。

0x00.信号量的作用

  信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,
是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,
线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。
其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,
需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。

0x01.LINUX信号量要使用到的函数

#include 
//初始化信号结构体int sem_init(sem_t *sem, int pshared, unsigned int value);int sem_post(sem_t *sem); //信号量+1int sem_wait(sem_t *sem); //信号量-1int sem_destroy(sem_t *sem); //销毁信号结构体

 

0x02.信号量示例代码

1 sem_t sem; 2 int count_num = 0; 3 void* ThreadFunc(void* argc); 4  5 int main(int argc, char* argv[]) 6 { 7     int status = sem_init(&sem, 0, 0); 8     pthread_t pid; 9 10     if(-1 == status)11     {12         perror("main()->sem_init()");13         exit(1);14     }15 16     status = pthread_create(&pid, NULL, ThreadFunc, NULL);17     if(0 != status)18     {19         perror("main()->pthread_create()!");20         exit(1);21     }22 23     //主线程阻塞点,通过信号量进行数数24     while(count_num < 10)25     {26         if((count_num % 2) != 0)27         {28             printf("%d ", count_num);29             ++count_num;30         }31 32         sem_post(&sem);33     }34 35     status  = pthread_join(pid, NULL);36     if(0 != status)37     {38         perror("main()->pthread_join()");39         exit(1);40     }41 42     sem_destroy(&sem);43 44     return 0;45 }46 47 //subthread count numbers48 void* ThreadFunc(void* argc)49 {50     //子线程阻塞点51     while(count_num < 10)52     {53         if((count_num % 2) == 0)54         {55             printf("%d ", count_num);56             ++ count_num;57         }58         sem_wait(&sem);59     }60 61     pthread_exit(NULL);62 }

 

0x03. 遇到的坑

阻塞点没写对,造成数数一直有问题,写代码要先弄清楚业务逻辑

转载于:https://www.cnblogs.com/ReacherGua/p/7359015.html

你可能感兴趣的文章
Apple Developer Registration and DUNS Number Not Accepted
查看>>
Hadoop学习笔记系列文章导航
查看>>
SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题
查看>>
Prometheus : 入门
查看>>
使用 PowerShell 创建和修改 ExpressRoute 线路
查看>>
PHP如何学习?
查看>>
在C#中获取如PHP函数time()一样的时间戳
查看>>
Redis List数据类型
查看>>
大数据项目实践(四)——之Hive配置
查看>>
初学vue2.0-组件-文档理解笔记v1.0
查看>>
NG-ZORRO-MOBILE 0.11.9 发布,基于 Angular 7 的 UI 组件
查看>>
我就是一个救火员(DBA救援)
查看>>
Centos7安装Gitlab10.0
查看>>
Windows Server 笔记(六):Active Directory域服务:域控制器安装
查看>>
discuz X3登录流程分析
查看>>
上传图片预览
查看>>
程序设计的一些原理
查看>>
lagp,lacp详解
查看>>
LVS之DR模式原理与实践
查看>>
struts2+extjs
查看>>