信号量是进化版的互斥锁:由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一个对象的一部分数据进行共享,使用互斥锁是没有办法实现的,只能对整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降,线程从并发执行,变成了串行执行。与直接使用单进程无异。
信号量,是相对折中的一种处理方式,既能保证同步,数据不混乱,又能提高线程并发。
1 /*
2 头文件:#include <semaphore.h>
3
4 初始化信号量:
5 int sem_init(sem_t *sem, int pshared, unsigned int value);
6 eg:sem_init(&(定义的全局信号量),0,5);//初始化信号量为5
7
8 销毁一个信号量:
9 int sem_destroy(sem_t *sem);
10 eg:sem_destroy(&(定义的全局信号量));//销毁该信号量
11
12 给信号量加锁:
13 int sem_wait(sem_t *sem);
14 eg:sem_wait(&(定义的全局信号量));//将信号量--,为0时则阻塞等待
15
16 尝试对信号量加锁
17 int sem_trywait(sem_t *sem);
18
19 限时对信号量加锁
20 int sem_timedwait(sem_t *restrict sem,const struct timespec *restrict abs_timeout);
21
22 给信号量解锁:
23 int sem_post(sem_t *sem);
24 eg: sem_post(&(定义的全局信号量));//将信号量++,同时唤醒阻塞在信号量的线程
25
26 返回值:成功返回0;失败返回-1
27 sem_t sem:声明信号量,sem不能<0
28 pshared:取0值代表用于线程间,取非0(一般为1)代表用于进程间
29 value:指定信号量的初始值
30
31 作用:通过操作信号量的值,限制进程或线程的动作(类似互斥锁)
32 */
本文介绍了信号量的概念及其在多线程编程中的应用。信号量作为一种更细粒度的同步机制,能够有效提升线程间的并发性,避免了互斥锁带来的串行执行问题。文章详细解释了信号量的初始化、加锁、解锁等操作,并提供了具体的示例代码。
966

被折叠的 条评论
为什么被折叠?



