一个简单的信号量的例子

news/2024/7/8 4:16:25 标签: 信号量, 线程, 临界资源, 共享, semaphore

1. 信号量

Linux提供了控制线程执行和访问代码临界区域的方法。其中最基本的两种办法是信号量和互斥量。

关于互斥量,笔者在Linux互斥量中介绍

本文只介绍semaphore.h 相关的信号量的简单的操作。关于信号量在笔者其他博客里有详细介绍。

Linux还有其他共享内存的方法。

2. 信号量相关函数

 

 


# include <semaphore.h >

int sem_init(sem_t *sem, int pshared, unsigned int value); //创建信号量

int sem_post(sem_t *sem); // +1操作

int sem_wait(sem_t *sem); //  -1操作

int sem_destroy(sem_t *sem); //销毁

 

 

3. 程序代码:

/***************************************
 *    @file            semaphore.c
 *    @brief        线程信号量
 *    @author        Windeal
 *    @date        2013/08/06
***************************************/

 
# include <stdlib.h >
# include <stdio.h >
# include <unistd.h >
# include <string.h >
# include <pthread.h >
# include <semaphore.h >
 
# define WORK_SIZE 1024     //
 
char work_area[WORK_SIZE];
sem_t bin_sem;
 
void *thread_function( void * arg);
 
int main( int argc, char * argv [ ])
{
     int ret ;
     void * thread_result;
    pthread_t a_thread;
 
    ret = sem_init( &bin_sem, 0, 0);      //初始化信号量为0
     if (ret != 0) {
        perror( "sem_init()  is failed!\n");
        exit(EXIT_FAILURE);
    }
 
    ret = pthread_create( &a_thread, NULL, thread_function, NULL);
     if (ret != 0) {
        perror( "thread create failed!\n");
        exit(EXIT_FAILURE);
    }
 
    printf( "Enter 'end' to finish!\n");
     while (strncmp( "end", work_area, 3) != 0) {
        fgets(work_area, WORK_SIZE, stdin);
        sem_post( &bin_sem);            // 信号量+ 1 操作
    }
 
    printf( "Waitint for thread join\n");
    ret = pthread_join(a_thread, &thread_result);
     if (ret != 0) {
        perror( "thread_join  failed!\n");
        exit(EXIT_FAILURE);
    }
 
    printf( "thread join()\n");
    sem_destroy( &bin_sem);
    exit(EXIT_FAILURE);
 
}
 
void *thread_function( void * arg){
    sem_wait( &bin_sem);                   // 信号量- 1 操作
     while (strncmp( "end", work_area, 3) != 0){
        printf( "you input %d charactor \n", strlen(work_area) - 1);
        sem_wait( &bin_sem);                   // 信号量- 1 操作
    }
    pthread_exit(NULL);
}
 

 

运行结果:

 


http://www.niftyadmin.cn/n/1079676.html

相关文章

WordPress 3.8.1 /xmlrpc.php拒绝服务漏洞

漏洞版本: WordPress 3.8.1 漏洞描述: WordPress是一款内容管理系统。WordPress 3.8.1 /xmlrpc.php 文件有ping其他主机的功能&#xff0c;通过这个功能可以请求多个站点&#xff0c;DDOS攻击别的网站。 <* 参考 http://blog.sucuri.net/2014/03/more-than-162000-wordpress…

一个简单的互斥量的例子

1。 互斥量Linux提供了控制线程执行和访问代码临界区域的方法。其中最基本的两种办法是信号量和互斥量。关于信号量&#xff0c;笔者在Linux信号量介绍中介绍本文只介绍semaphore.h 相关的信号量的简单的操作。关于信号量在笔者其他博客里有详细介绍。 Linux还有其他共享内存的…

统计代码行数的小技巧

统计代码行数的小技巧 原文地址&#xff1a;http://zhouhua.github.io/2013/06/20/skills/ 在项目中&#xff0c;我们常常有统计代码行数的需要&#xff0c;但是如果不利用第三方工具的话&#xff0c;面对一个项目&#xff08;甚至一个工程或解决方案中若干个项目&#xff09;中…

进程同步与异步

同步&#xff1a; 过程的执行有一定的顺序&#xff0c;也就是说必须一步一步执行。举个例子&#xff0c;在socket中&#xff0c;服务器accept&#xff08;&#xff09;等待客户端的连接&#xff0c;这里的等待实际上就是阻塞了&#xff0c;在客户端连接之前&#xff0c;该过程不…

Java int Integer

http://www.cnblogs.com/haimingwey/archive/2012/04/16/2451813.html http://developer.51cto.com/art/200906/130459.htm public final class Integer extends Number implements Comparable<Integer> Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的…

初探单点登录 SSO

单点登录 单点登录&#xff08;Single sign-on&#xff0c;SSO&#xff09;是一种访问控制&#xff0c;在多个软件应用中&#xff0c;用户只需登录其中一个应用&#xff0c;就可以成功访问其他应用&#xff1b;同样&#xff0c;用户只需注销其中一个应用&#xff0c;就可以成功…

H.264采集、编码、传输的流程

转载自H.264采集、编码、传输的流程 1 采集到的原始数据放入buf中2 转化为yuv格式放入yuvconv.RGB24_to_YV12(buf, yuv,IMAGE_WIDTH, IMAGE_HEIGHT) ;3 调用编码器进行编码3.1 从yuv中读取数据到m_picread_frame_yuv( &m_Pic, m_pOpt->hin, i_Frame m_pOpt->i_see…

机器学习问题之屌丝的女神专属

转载请注明出处[zz_boy]&#xff1a;http://www.cnblogs.com/zz-boy/p/3648434.html 欢迎大家访问我的其它博客&#xff0c;我的博客园主页&#xff1a;http://www.cnblogs.com/zz-boy/ 每个屌丝都有自己的女神专属 屌丝的通病便是眼神不老实。走在街上&#xff0c;看到漂亮妹子…