信号量

信号量函数的名字都以sem_开头,并不像大多数线程函数那样以pthread_开头。
线程中使用的基本信号量有四个,它们都非常的简单。
#include <semaphore.h>
int sem_init(sem_t *sem,int pshared,unsigned int value);

int sem_wait(sem_t *sem);

int sem_post(sem_t *sem);

sem_post函数的作用是以原子方式给信号量的值加1.
所谓原子操作是指,如果两个线程企图同时给一个信号量加1,它们之间不会互相干扰。
sem_wait函数以原子方式将信号量的值减1.
int sem_destroy(sem_t *sem);

 

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

void *thread_function(void *arg);
sem_t bin_sem;
#define WORK_SIZE 1024
char work_area[WORK_SIZE];

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");
        exit(EXIT_FAILURE);
    }
    res=pthread_create(&a_thread, NULL, thread_function, NULL);
    if( res != 0)
    {
        perror("Thread creation failed!");
        exit(EXIT_FAILURE);
    }
    printf("Input some text.Enter 'end' to finish\n");
    while(strncmp("end",work_area,3) != 0)
    {
        fgets(work_area,WORK_SIZE,stdin);
        sem_post(&bin_sem);
    }
    printf("\nWaiting for thread to finish...\n");
    res = pthread_join(a_thread,&thread_result);
    if(res != 0)
    {
        perror("Thread join failed");
        exit(EXIT_FAILURE);
    }
    printf("Thread joined!\n");
    sem_destroy(&bin_sem);
    exit(EXIT_SUCCESS);
}

void *thread_function(void *args)
{
    sem_wait(&bin_sem);
    while(strncmp("end",work_area,3) != 0 )
    {
        printf("You input %d characters\n",strlen(work_area)-1);
        sem_wait(&bin_sem);
    }
    pthread_exit(NULL);
}


Input some text.Enter 'end' to finish

The Wasp Factory

You  input  16 characters

Iain  Banks

You input 10 characters

end

 

Waiting  for thread to finish...

Thread  joined

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值