专注高密做网站哪家强,飞书企业邮箱怎么申请,福田瑞沃小金刚,四川网络营销推广linux多线程编程-信号量信号量机制锁机制使用是有限制的#xff0c;锁只有两种状态#xff0c;即加锁和解锁#xff0c;对于互斥的访问一个全局变量#xff0c;这样的方式还可以对付#xff0c;但是要是对于其他的临界资源#xff0c;比如说多台打印机等#xff0c;这种…linux多线程编程-信号量信号量机制锁机制使用是有限制的锁只有两种状态即加锁和解锁对于互斥的访问一个全局变量这样的方式还可以对付但是要是对于其他的临界资源比如说多台打印机等这种方式显然不行了。信号量机制在操作系统里面学习的比较熟悉了信号量是一个整数计数器其数值表示空闲临界资源的数量。当有进程释放资源时信号量增加表示可用资源数增加当有进程申请到资源时信号量减少表示可用资源数减少。这个时候可以把锁机制认为是0-1信号量。关于信号量机制的函数 初始化信号量int sem_init(sem_t * sem, int pshared, unsigned int value);- 成功返回0失败返回-1- 参数sem表示指向信号结构的指针。- 参数pshared不是0 的时候该信号量在进程间共享否则只能在当前进程的所有线程间共享。- 参数value信号量的初始值。int sem_wait(sem_t *sem); 信号量减一操作有线程申请资源- 成功返回0否则返回-1- 参数sem指向一个信号量的指针int sem_post(sem_t *sem);信号量加一操作有线程释放资源- 成功返回0否则返回-1- 参数sem指向一个信号量指针int sem_destroy(sem_t *sem); 销毁信号量- 成功返回0否则返回-1- 参数sem指向一个信号量的指针。信号量来解决多线程的同步问题程序代码如下#include#include#include#include#include#include void* ticketport1(void*);void* ticketport2(void*);int tickets100;sem_t mutex,full; //定义两个信号量int main(){ int ret; pthread_t id1,id2; retsem_init(mutex,0,1); //初始化mutex信号量为1 retsem_init(full,0,0); //初始化full信号量为0 if(ret!0) { perror(sem_init); } retpthread_create(id1,NULL,ticketport1,NULL); if(ret0) { perror(creat thread1:); exit(-1); } retpthread_create(id2,NULL,ticketport2,NULL); if(ret0) { perror(creat thread2:); exit(-1); } pthread_join(id1,NULL); pthread_join(id2,NULL); return 0;}void* ticketport1(void* arg){ while(1) { sem_wait(mutex); //mutex信号量进行P操作 if(tickets0) { usleep(1000); printf(thread1 sell ticket: %d,tickets--); sem_post(full); //full信号量进行V操作 } else { sem_post(full); //full信号量进行V操作 break; } } return (void*)0;}void* ticketport2(void* arg){ while(1) { sem_wait(full); //full信号量进行P操作 if(tickets0) { usleep(1000); printf(thread2 sell ticket: %d,tickets--); sem_post(mutex); //mutex信号量进行V操作 } else { sem_post(mutex); //mutex信号量进行V操作 break; } } return (void*)0;}上面的sem_init函数用来初始化两个信号量的初始化值这里一个设为1一个设为0sem_wait类似于P操作让信号量减1如果小于结果小 于0线程阻塞否则线程继续执行sem_post类似于V操作提升信号量的值加1通过这两个信号量之间的互相“救对方”就可以实现这两个线程 的同步执行经典的生产者消费者问题只有当生产者把资源放入存储区消费者才能取得#include #include #include #include #define MAXSIZE 10int stack[MAXSIZE];int size 0;sem_t sem;void privide_data(void){ int i; for(i 0;i { stack[i] i; sem_post(sem); }}void handle_data(void){ int i; while((i size ) { sem_wait(sem); printf(cross : %d X %d %d ,stack[i],stack[i],stack[i] * stack[i]); sleep(1); }}int main(){ pthread_t privider,handler; sem_init(sem,0,0); pthread_create(privider,NULL,(void *)privide_data,NULL); pthread_create(handler,NULL,(void *)handle_data,NULL); pthread_join(privider,NULL); pthread_join(handler,NULL); sem_destroy(sem); return 0;}