`
lemoncyb
  • 浏览: 50034 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[转]Linux信号量 sem_t简介

阅读更多
信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为:  

extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));  

sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。  

函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。  

函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。  

函数sem_destroy(sem_t *sem)用来释放信号量sem。 

信号量用sem_init函数创建的,下面是它的说明:
#include<semaphore.h>
int sem_init (sem_t *sem, int pshared, unsigned int value);

这 个函数的作用是对由sem指定的信号量进行初始化,设置好它的共享选项,并指定一个整数类型的初始值。pshared参数控制着信号量的类型。如果 pshared的值是0,就表示它是当前里程的局部信号量;否则,其它进程就能够共享这个信号量。我们现在只对不让进程共享的信号量感兴趣。 (这个参数 受版本影响), pshared传递一个非零将会使函数调用失败。

这两个函数控制着信号量的值,它们的定义如下所示:

#include <semaphore.h>
int sem_wait(sem_t * sem);
int sem_post(sem_t * sem);

这两个函数都要用一个由sem_init调用初始化的信号量对象的指针做参数。
sem_post 函数的作用是给信号量的值加上一个“1”,它是一个“原子操作”---即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;而同 时对同一个文件进行读、加和写操作的两个程序就有可能会引起冲突。信号量的值永远会正确地加一个“2”--因为有两个线程试图改变它。
sem_wait 函数也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。也就是说,如果你对 一个值为2的信号量调用sem_wait(),线程将会继续执行,介信号量的值将减到1。如果对一个值为0的信号量调用sem_wait(),这个函数就 会地等待直到有其它线程增加了这个值使它不再是0为止。如果有两个线程都在sem_wait()中等待同一个信号量变成非零值,那么当它被第三个线程增加 一个“1”时,等待线程中只有一个能够对信号量做减法并继续执行,另一个还将处于等待状态。
信号量这种“只用一个函数就能原子化地测试和设置”的能力下正是它的价值所在。 还有另外一个信号量函数sem_trywait,它是sem_wait的非阻塞搭档。

最后一个信号量函数是sem_destroy。这个函数的作用是在我们用完信号量对它进行清理。下面的定义:
#include<semaphore.h>
int sem_destroy (sem_t *sem);
这个函数也使用一个信号量指针做参数,归还自己战胜的一切资源。在清理信号量的时候如果还有线程在等待它,用户就会收到一个错误。
与其它的函数一样,这些函数在成功时都返回“0”。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>

sem_t bin_sem;
void *thread_function1(void *arg)
{
printf("thread_function1--------------sem_wait\n");
sem_wait(&bin_sem);
printf("sem_wait\n");
while (1)
{
}
}

void *thread_function2(void *arg)
{
printf("thread_function2--------------sem_post\n");
sem_post(&bin_sem);
printf("sem_post\n");
while (1)
{
}
}



int main()
{
int res;
pthread_t a_thread;
void *thread_result;

res = sem_init(&bin_sem, 0, 0);
if (res != 0)
{
perror("Semaphore initialization failed");
}
printf("sem_init\n");
res = pthread_create(&a_thread, NULL, thread_function1, NULL);
if (res != 0)
{
perror("Thread creation failure");
}
printf("thread_function1\n");
sleep (5);
printf("sleep\n");
res = pthread_create(&a_thread, NULL, thread_function2, NULL);
if (res != 0)
{
perror("Thread creation failure");
}
while (1)
{
}
}

sem_init
thread_function1
thread_function1--------------sem_wait
sleep
thread_function2--------------sem_post
sem_wait
sem_post
分享到:
评论

相关推荐

    linux中进程问题

    //定义信号量 sem_t applefull; sem_t orangefull; void *procf(void *arg) //father线程 { while(1){ sem_wait(&empty;); //P操作 printf("%s\n",(char *)arg); sem_post(&applefull;); //V操作 Sleep(7)...

    linux信号量机制

    信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于0时,才能使用公共资源,... 信号量的数据类型为结构sem_t,它本质上是

    Sem.rar_linux sem_linux sem.c_信号量

    linux下system V信号量的C语言封装,及其示例代码,用于进程间通信。

    Linux之信号量_很全面的分析_个人整理的

    Linux之信号量_很全面的分析_个人整理的

    sem_syn.rar_linux syn_信号量_线程 同步

    通过两个信号量来实现两个线程间的同步,完成了互斥功能.

    sem.tar.gz_linux 信号量_linux 封装

    Linux下信号量编程,封装好了接口,可以方便使用

    linux信号量实例代码

    linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号...

    sem_fork.c文件

    sem_fork.c文件,详细看博客http://blog.csdn.net/mybelief321/article/details/9086151

    linux信号量机制学习

    linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号...

    sem.rar_linux sem_semdemo.c

    linux信号量使用方法,示例中包括源码和makefie,以及经过编译的文件,可以直接运行

    linux信号量详解

    关于linux c 开发中的信号量的使用,有详细的说明

    Linux信号量源码

    在Linux在利用信号量机制实现双方通信

    linux 信号量中断 时间

    linux 信号量 中断 时间,详细表述了linux下面的信号量,中断,时间等要素

    Linux进程及信号灯

    Linux进程及信号灯,编程模拟实现生产者/消费者。

    rt-thread信号量_holecev_RT-Thread_rtthread信号量_信号量_

    学习rt-thread信号量的很好资料,大家共同学习进步

    操作系统——Linux信号量机制

    在Linux环境下实现一个多线程对临界资源的互斥操作,利用信号量实现对临界资源的保护,支持Linux下文件输入输出,提高对Linux环境下多进程、多线程、信号量机制和文件操作等知识的理解。 设有进程A、B、C,分别调用...

    生产者消费者

    #include&lt;linux/sem.h&gt; #include #define NUM_LOOPS 20 int main(int argc,char *argv[]) { int sem_set_id; //信号量集的ID union semun seM_val; //信号量的数值 int child_pid; //子进程的PID struct sembuf...

    linux网络编程全套代码

    无名信号量(内存信号量): sem_t, p, v, 互斥锁:pthread_mutex_t 进程: Fork()/ execve();// system(); 进程内存空间 环境变量: 从哪里来, 放在那里, 如何取用 进程通信: 传统: 无名管道 pipe: 亲缘...

    Linux内核信号量分析

    Linux内核信号量分析

    利用信号量实现进程间同步

    压缩包内含4个文件:a....semaphore.h和semaphore.c主要实现了sem_init,sem_p,sem_v,sem_del这四个函数(函数体内是转调semget,semctl,semop,这三个函数都是linux提供的库函数)。以一个.txt文件来模拟临界资源。

Global site tag (gtag.js) - Google Analytics