建设部人力资源开发中心网站,申请网站免费,企业网站的网址有哪些,网页h5背景
在项目实施过程中#xff0c;有个机制需要做两个线程之间的同步。
具体需求如下#xff1a;
首先#xff0c;线程1需要把资源读取到缓存
其次#xff0c;线程2才可以操作这块缓存
上述两个动作顺序交替重复。
思路
使用信号量解决思路#xff0c;申请两个信号…背景
在项目实施过程中有个机制需要做两个线程之间的同步。
具体需求如下
首先线程1需要把资源读取到缓存
其次线程2才可以操作这块缓存
上述两个动作顺序交替重复。
思路
使用信号量解决思路申请两个信号量具体流程如下所述
申请两个信号量其中信号量1初始化为无信号信号量2初始化为有信号
线程1首先申请信号量2的信号有信号后线程1把资源读取到缓存后才释放信号量1
线程2首先申请信号量1的信号有信号后线程2操作完这块缓存后才释放信号量2
代码
具体代码如下
头文件
#include semaphore.h
定义全局信号量
sem_t sem1;
sem_t sem2;
初始化信号量这里信号量2申请为有信号状态 ret sem_init(sem1, 0, 0);if (ret -1) {printf(sem1_init failed \n);return -1;}ret sem_init(sem2, 0, 1);if (ret -1) {printf(sem2_init failed \n);return -1;}
线程1首先申请信号量2的信号有信号后线程1把资源读取到缓存后才释放信号量1
void* thread1(void *res)
{while (1) {sem_wait(sem2);//开始写入保护的内存数据xxxxxxxxxx//结束写入保护的内存数据sem_post(sem1);}
}线程2首先申请信号量1的信号有信号后线程2操作完这块缓存后才释放信号量2
void* thread2(void *res)
{while (1) {sem_wait(sem1);//开始读出保护的内存数据xxxxxxxxxx//结束读出保护的内存数据sem_post(sem2);}
}上述基本上表述了针对内存的保护不知道说清楚了没有。表述应该还算明白 线程申请信号不能一直等待需要超时处理我这超时设置时毫秒级别时间比较长
具体代码如下设置500ms超时等待
struct timespec ts;clock_gettime(CLOCK_REALTIME, ts);ts.tv_nsec 500*1000*1000;sem_timedwait(sem,ts);
信号量的一些基本概念 信号量本质上是一个计数器不设置全局变量是因为进程间是相互独立的而这不一定能看到看到也不能保证引用计数为原子操作,用于多进程对共享数据对象的读取它和管道有所不同它不以传送数据为主要目的它主要是用来保护共享资源信号量也属于临界资源使得资源在一个时刻只有一个进程独享。 由于信号量只能进行两种操作等待和发送信号即P(sv)和V(sv),他们的行为是这样的
1P(sv)如果sv的值大于零就给它减1如果它的值为零就挂起该进程的执行
2V(sv)如果有其他进程因等待sv而被挂起就让它恢复运行如果没有进程因等待sv而挂起就给它加1.
在信号量进行PV操作时都为原子操作因为它需要保护临界资源
注原子操作单指令的操作称为原子的单条指令的执行是不会被打断的