直接使用一个共享变量,来是两个线程之间进行切换是非常笨拙而且没有效率的;信号量--互斥量--这两者是相互通过对方来实现的;比如,如果想控制某一时刻只有一个线程可以访问一些共享内存,使用互斥量要自然一些; 但是控制一组相同的对下的访问时,比如同5条可用的电话线中分配1条给某个可用的线程,那么使用计数信号量;------------------------------------- 信号量,是一个特殊类型的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作,及时一个多线程程序也是如比; 意味着如果两个(更多)的现场试图改变一个信号量的值,系统保证所有的操作都将一次进行信号量,二进制信号量只有0/1两种取值,还有一种更通用的信号量--计数信号量;信号量函数的名字以sem_开头,而不像大多数线程函数那样以pthread_开头基本信号量函数有四个:---#include<semaphore.h>int sem_init(sem_t *sem,int psthared, unsigned int value);信号量通过这个函数来创建,由sem指向的信号量对象,设置他的共享参数,给一个初始的整数值psthared,控制信号量的类型,其值为0,表示这个信号量是当前进程的局部信号量,否则该信号量可以在多个进程见共享---#include <semaphore.h>int sem_wait(sem_t *sem);wait函数将信号量的减到1,但是会等到新好两有个非零值才会开始减法操作;如果对为0的信号量调用sem_wait函数,函数会等待,知道其他线程增加了该信号量的值使其!=0; ---#include <semaphore.h>int sem_post(sem_t *sem);post函数作用是以原子操作的方式将信号量的值+1; 描述:”在单个函数中就能原子化地进行测试和设置“的能力很有价值;---sem_trywait()是sem_wait的非阻塞版本以一个信号量指针为参数,清理该信号量拥有的所有资源,如果企图清理信号量正被一个线程等待,返回一个错误---#include <semaphore.h>int sem_destroy(sem_t *sem); ==============例子;
时间: 2024-08-24 19:49:36