linux多线程学习(五)——信号量线程控制

PV原语是对整数计数器信号量sem的操作,一次P操作可使sem减一,而一次V操作可是sem加一。进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。当信号量的值大于零或等于零的时候,该进程(或线程)具有对公共资源访问的权限,否则,当信号量的值小于时,该进程(或线程)就会被阻塞,直到信号量的值大于或等于一。

1、在LINUX中,实现了POSIX的无名信号量,主要用于线程间的互斥同步,下面将简单介绍一些函数接口:

(1)、sem_init

功能: 用于创建一个信号量,并初始化信号量的值。

头文件: <semaphore.h>

函数原型: int sem_init (sem_t* sem, int pshared, unsigned int value);

函数传入值: sem:信号量。

pshared:决定信号量能否在几个进程间共享。由于目前LINUX还没有实现进

程间共享信息量,所以这个值只能取0。

函数返回值: 0:成功。

-1:失败。

(2)其他函数。

int sem_wait (sem_t* sem);

int sem_trywait(sem_t* sem);

int sem_post (sem_t* sem);

int sem_getvalue (sem_t* sem);

int sem_destroy (sem_t* sem);

功能:sem_wait和sem_trywait相当于P操作,它们都能将信号量的值减一,两者的区别在

于若信号量的值小于零时,sem_wait将会阻塞进程,而sem_trywait则会立即返回。

sem_post相当于V操作,它将信号量的值加一,同时发出唤醒的信号给等待的进程

(或线程)。

sem_getvalue 得到信号量的值。

sem_destroy 摧毁信号量。

函数传入值: sem:信号量。

函数返回值: 同上。

2、函数实现。

#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 1024char 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 soem 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 *arg){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);}

~~END~~

所有的胜利,与征服自己的胜利比起来,都是微不足道

linux多线程学习(五)——信号量线程控制

相关文章:

你感兴趣的文章:

标签云: