最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

Linux线程的信号量同步

来源:懂视网 责编:小OO 时间:2024-12-27 15:48:10
文档

Linux线程的信号量同步

信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。不多做解释,要使用信号量同步,需要包含头文件semaphore.h。主要用到的函数。intsem_init(sem_t*sem,intpshared,unsignedintvalue);,其中sem是要初始化的信号量,pshared表示此信号量是在进程间共享还是线程间共享,value是信号量的初始值。intsem_destroy(sem_t*sem);,其中sem是要销毁的信号量。只有用sem_init初始化的信号量才能用sem_destroy销毁。
推荐度:
导读信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。不多做解释,要使用信号量同步,需要包含头文件semaphore.h。主要用到的函数。intsem_init(sem_t*sem,intpshared,unsignedintvalue);,其中sem是要初始化的信号量,pshared表示此信号量是在进程间共享还是线程间共享,value是信号量的初始值。intsem_destroy(sem_t*sem);,其中sem是要销毁的信号量。只有用sem_init初始化的信号量才能用sem_destroy销毁。

系统大全为您提供
信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。
不多做解释,要使用信号量同步,需要包含头文件semaphore.h。
主要用到的函数:
intsem_init(sem_t*sem,intpshared,unsignedintvalue);,其中sem是要初始化的信号量,pshared表示此信号量是在进程间共享还是线程间共享,value是信号量的初始值。
intsem_destroy(sem_t*sem);,其中sem是要销毁的信号量。只有用sem_init初始化的信号量才能用sem_destroy销毁。
intsem_wait(sem_t*sem);等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回。如果信号量的值为0,则线程阻塞。相当于P操作。成功返回0,失败返回-1。
intsem_post(sem_t*sem);释放信号量,让信号量的值加1。相当于V操作。
下列的代码演示了如何用信号量同步,模拟一个窗口服务系统。
/*@purpose:基于信号量的多线程同步,操作系统原理中的P,V操作
 *@author:jollywing@foxmail.com
 *@create:2015-03-20Fri
 **/
 
#include<pthread.h>
#include<semaphore.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
 
 
/*@Scene:某行业营业厅同时只能服务两个顾客。
 *有多个顾客到来,每个顾客如果发现服务窗口已满,就等待,
 *如果有可用的服务窗口,就接受服务。*/
 
/*将信号量定义为全局变量,方便多个线程共享*/
sem_tsem;
 
/*每个线程要运行的例程*/
void*get_service(void*thread_id)
{
  /*注意:立即保存thread_id的值,因为thread_id是对主线程中循环变量i的引用,它可能马上被修改*/
  intcustomer_id=*((int*)thread_id);
 
  if(sem_wait(&sem)==0){
    usleep(100);        /*servicetime:100ms*/
    printf("customer%dreceiveservice...
",customer_id);
    sem_post(&sem);
  }
}
 
#defineCUSTOMER_NUM10
 
intmain(intargc,char*argv[])
{
  /*初始化信号量,初始值为2,表示有两个顾客可以同时接收服务*/
  /*@prototype:intsem_init(sem_t*sem,intpshared,unsignedintvalue);*/
  /*pshared:ifpshared==0,thesemaphoreissharedamongthreadsofaprocess
   *otherwisethesemaphoreissharedbetweenprocesses. */
  sem_init(&sem,0,2);
 
  /*为每个顾客定义一个线程id,pthread_t其实是unsignedlongint*/
  pthread_tcustomers[CUSTOMER_NUM];
 
  inti,ret;
  /*为每个顾客生成一个线程*/
  for(i=0;i<CUSTOMER_NUM;i++){
    intcustomer_id=i;
    ret=pthread_create(&customers[i],NULL,get_service,&customer_id);
    if(ret!=0){
      perror("pthread_create");
      exit(1);
    }
    else{
      printf("Customer%darrived.
",i);
    }
    usleep(10);
  }
 
  /*等待所有顾客的线程结束*/
  /*注意:这地方不能再用i做循环变量,因为可能线程中正在访问i的值*/
  intj;
  for(j=0;j<CUSTOMER_NUM;j++){
    pthread_join(customers[j],NULL);
  }
 
  /*Onlya semaphorethat hasbeeninitialized bysem_init(3)
   *shouldbedestroyedusingsem_destroy().*/
  sem_destroy(&sem);
  return0;
}
编译:gccmain.c-lpthread。
运行结果(注意,每次运行都不相同):
Customer0arrived.
Customer1arrived.
customer0receiveservice...
Customer2arrived.
customer1receiveservice...
Customer3arrived.
customer2receiveservice...
Customer4arrived.
customer3receiveservice...
Customer5arrived.
customer4receiveservice...
Customer6arrived.
customer5receiveservice...
Customer7arrived.
customer6receiveservice...
Customer8arrived.
customer7receiveservice...
Customer9arrived.
customer8receiveservice...
customer9receiveservice...
 
 
  以上就是系统大全给大家介绍的如何使的方法都有一定的了解了吧,好了,如果大家还想了解更多的资讯,那就赶紧点击系统大全官网吧。 
 
本文来自系统大全http:///如需转载请注明!推荐:win7纯净版

文档

Linux线程的信号量同步

信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。不多做解释,要使用信号量同步,需要包含头文件semaphore.h。主要用到的函数。intsem_init(sem_t*sem,intpshared,unsignedintvalue);,其中sem是要初始化的信号量,pshared表示此信号量是在进程间共享还是线程间共享,value是信号量的初始值。intsem_destroy(sem_t*sem);,其中sem是要销毁的信号量。只有用sem_init初始化的信号量才能用sem_destroy销毁。
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top