您的位置:首页 > 其它

Semaphore与Mutex简介

2014-04-02 09:45 387 查看
Semaphore,即信号量(CreateSemaphore/sem_init),官网解释是用来保护多重资源的访问,它可以设置一个大于0的值,如N,任何访问者在该信号量大于1的情况下均可以获得资源的访问权,并将相应的信号量减1,当访问完成后,信号量加1,即该资源可以同时容纳N个访问者。但是据我了解,一般在为了线程在某一定程度上的顺序执行才使用信号量,即线程A等待线程B执行完某些操作以后,才能继续往下执行,可以理解为,组装厂A需要等待(WaitForSingleObject/sem_wait)元件厂B交付元件以后(ReleaseSemaphore/sem_post)才能继续生产。当信号量不再使用时,销毁它(CloseHandle/sem_destroy)Mutex,(CreateMutex/pthread_mutex_init)互斥体,就是限制某一资源的访问,每次只能容纳一个访问者。访问者A进入房间以后立即锁门(WaitForSingleObject/pthread_mutex_lock),任何其他人都不许进入,等A访问完以后打开锁(ReleaseMutex/pthread_mutex_unlock),访问者B才可以进入。当资源不再被使用时,释放资源(CloseHandle/pthread_mutex_destroy).1.Semaphore在linux下与Semaphore相关的操作函数为:

sem_init():初始化一个信号量

sem_wait():一直等待信号量,直到信号量大于0

sem_timedwait():设定超时等待。

sem_post():信号量加1

sem_destory():释放信号量。

例:
#include <stdio.h>
#include <errno.h>
#include <semaphore.h>
#include <time.h>
int main() {sem_t mysemp;struct timespec ts;int sts, val;if ( sem_init (&mysemp, 0, 0) == -1 ) {//第二个参数设定信号量可见范围,0,进程内可见,用于线程间的同步操作,1是进程间可见。perror("sem_init is err");return P-1;}ts.tv_sec=time(NULL)+10;//10s超时等待ts.tv_nsec=0;//不可少sts = sem_timedwait(&mysemp, &ts);
//sts = sem_wai(&mysemp);//永远等待....
sem_destroy(&mysemp);}
2.Mutex
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: