线程同步之信号量

来源:互联网 发布:windows历史各系统版本 编辑:程序博客网 时间:2024/05/16 09:45

信号量

头文件  semaphore.h

信号量类型:sem_t 

加强版的互斥锁:

1、互斥锁的初始值只能是1,但是信号量可以人为的规定有几个互斥量,规定共享资源的数量。

2、互斥锁规定只能一个线程进行加锁和解锁的操作,但是信号量可以让这个线程加锁,另一个线程解锁。

3、 互斥量用于线程的互斥,信号线用于线程的同步。 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。 

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

主要操作函数:

              ○ 初始化信号量

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

                     pshared  § 0 - 线程同步

                                    § 1 - 进程同步

                     value     § 最多有几个线程操作共享数据

              ○ 销毁信号量

              sem_destroy(sem_t*sem);

              ○ 加锁  --             

              sem_wait(sem_t*sem);

                     调用一次相当于对sem做了--操作,减少一个资源。如果sem值为0, 线程会阻塞

              ○ 尝试加锁

              sem_trywait(sem_t*sem);

                     § sem == 0, 加锁失败, 不阻塞, 直接返回

              ○ 限时尝试加锁

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

abs_timeout 指定一个阻塞的时间上限,如果调用因不能立即执行递减而要阻塞。abs_timeout 参数指向一个指定绝对超时时刻的结构,这个结果由自 Epoch,1970-01-0100:00:00 +0000(UTC) 秒数和纳秒数构成。

              ○ 解锁 ++

              sem_post(sem_t*sem);

                     对sem做了++操作,释放一个资源。


原创粉丝点击