7. 名称:: sem_init/sem_destroy
功能: 初始化/关闭信号等 #include
基于内存的信号灯是由sem_init初始化的。sem参数指向必须由应用程序分配的sem_t 变量。如果shared为0,那么待初始化的信号灯是在同一进程的各个线程共享的,否则该信号灯是在进程间共享的。当shared为零时,该信号灯必须存放在即将使用它的所有进程都能访问的某种类型的共享内存中。跟sem_open一样,value参数是该信号灯的初始值。 使用完一个基于内存的信号灯后,我们调用sem_destroy关闭它。
除了sem_open和sem_close外,其它的poisx有名信号灯函数都可以用于基于内存的信号灯。
注意:posix基于内存的信号灯和posix有名信号灯有一些区别,我们必须注意到这
些。
1.sem_open不需要类型与shared的参数,有名信号灯总是可以在不同进程间共享的。
2.sem_init不使用任何类似于O_CREAT标志的东西,也就是说,sem_init总是初始化信号灯的值。因此,对于一个给定的信号灯,我们必须小心保证只调用一次sem_init。
3.sem_open返回一个指向某个sem_t变量的指针,该变量由函数本身分配并初始化。但sem_init的第一个参数是一个指向某个sem_t变量的指针,该变量由调用者分配,然后由sem_init函数初始化。
4.posix有名信号灯是通过内核持续的,一个进程创建一个信号灯,另外的进程可以通过该信号灯的外部名(创建信号灯使用的文件名)来访问它。posix基于内存的信号灯的持续性却是不定的,如果基于内存的信号灯是由单个进程内的各个线程共享的,那么该信号灯就是随进程持续的,当该进程终止时它也会消失。如果某个基于内存的信号灯是在不同进程间同步的,该信号灯必须存放在共享内存区中,这要只要该共享内存区存在,该信号灯就存在。
5.基于内存的信号灯应用于线程很麻烦(待会你会知道为什么),而有名信号灯却很 方便,基于内存的信号灯比较适合应用于一个进程的多个线程。
下面是posix基于内存的信号灯实现一个进程的各个线程间的互次。 #include
void*thread_function(void*arg);/*线程入口函数*/
voidprint(void);/*共享资源函数*/
sem_tbin_sem;/*定义信号灯*/
intvalue;/*定义信号量的灯*/
intmain() {
intn=0;
pthread_ta_thread;
if((sem_init(&bin_sem,0,2))!=0)/*初始化信号灯,初始值为2*/
{
perror(“sem_init”); exit(1); }
while(n++<5)/*循环创建5个线程*/
{
if((pthread_create(&a_thread,NULL,thread_function,NULL))!=0) {
perror(“Threadcreationfailed”); exit(1); }
}
pthread_join(a_thread,NULL);/*等待子线程返回*/ }
void*thread_function(void*arg) {
sem_wait(&bin_sem);/*等待信号灯*/
print(); sleep(1);
sem_post(&bin_sem);/*挂出信号灯*/
printf(“Ifinished,mypidis%d\\n”,pthread_self()); pthread_exit(arg); }
voidprint() {
printf(“Iget it,mytidis%d\\n”,pthread_self());
sem_getvalue(&bin_sem,&value);/*获取信号灯的值*/
printf(“Nowthevaluehave%d\\n”,value); }
posix基于内存的信号灯和有名信号灯基本是一样的,上面的几点区别就可以了。
下面是运行结果:
#gcc–lpthread–oseminitthreadseminitthread.c
#./seminitthread
Igetit,mytidis1082330304
Now thevaluehave1 Igetit,mytidis1090718784
Now thevaluehave0
Ifinished,mypidis1082330304
Ifinished,mypidis1090718784 Igetit,mytidis1099107264
Now thevaluehave1 Igetit,mytidis1116841120 Now thevaluehave0
Ifinished,mypidis1099107264 Ifinished,mypidis1116841120 Igetit,mytidis1125329600 Now thevaluehave1
Ifinished,mypidis1125329600 下面是经典的生产者消费者问题: #include
相关推荐: