Linux多线程编程入门-同步机制-信号量

原创 2013年12月03日 11:59:12

int sem_init(sem_t *sem, int pshared, unsigned int value);

pshared:控制信号量的类型,0表示这个信号量是当前进程的局部信号量,否则,这个信号量就可以在多个进程之间共享。 value:信号量的初始值。


int sem_post(sem_t *sem);以原子操作的方式给信号量的值加1。这里的原子操作指两个线程企图同时给一个 信号量加1,它们之间不会互相干扰。会正确的加为2.

int sem_wait(sem_t *sem);以原子操作的方式给信号量的值减1。它会等待直到信号量有一个非零值才会开始减法操作。


int sem_destory(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);
	res = pthread_create(&a_thread, NULL, thread_function, NULL);
	printf("Input some 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);
	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);
}

解析:

初始化信号量时,把它的值设置为0。这样,在 线程函数启动时,sem_wait函数调用就会阻塞并等待信号量变为非零值。

        主线程中,等待直到有文本输入,然后调用sem_post增加信号量的值,这将立即令另一个线程从sem_wait的等待中返回并开始执行。在统计完字符个数之后,它再次调用sem_wait并再次被阻塞,直到主线程再次调用sem_post增加信号量的值为止。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux下多线程同步机制之信号量、互斥量、读写锁、条件变量

之前有写过类似的博客,这东西不用老忘,现在又有更清晰的理解了。 一、信号量 信号量最基本的两个操作就是PV操作:P()操作实现信号量减少,V()操作实现信号量的增加 信号量的值取决于信号量的类型,信号...
  • ylf13
  • ylf13
  • 2013-10-29 16:39
  • 5684

多线程编程入门(15):线程同步工具之Semaphore(信号量)

package cn.itcast.heima2; import java.util.concurrent.ExecutorService; import java.util.concurrent....

linux 多线程编程 之 信号量互斥同步

本文在上一篇的基础上进一步说明,Linux下多线程编程的互斥与同步。上一篇实现线程之间同步采用了互斥锁,同步采用条件变量,本文将说明如何使用信号量实现线程之间的互斥与同步。互斥锁只有0,1两中状态,适...

【Linux】 多线程编程(信号量实现同步)

该问题如下: 有一个有限缓冲区(在这里使用命名管道实现FIFO式缓冲区)和两个线程:生产者和消费者 一个生产者在缓冲区满的时候必须等待,消费者在缓冲区为空的时候也必须等待 在该程序中定义3个信号...

Linux多线程编程(四)线程同步之信号量

信号量是一个特殊类型的变量,它可以被增加或者减少。 信号量是一个原子操作。(原子操作是指不会被线程调度机制打断的操作。这种操作一旦开始,就一直运行到结束,中间不会切 换到另一个线程)

linux 多线程编程 之 信号量互斥同步

本文在上一篇的基础上进一步说明,Linux下多线程编程的互斥与同步。上一篇实现线程之间同步采用了互斥锁,同步采用条件变量,本文将说明如何使用信号量实现线程之间的互斥与同步。互斥锁只有0,1两中状态,适...

【原创】《Linux高级程序设计》杨宗德著 - Linux多线程编程 - 线程同步机制

【原创】《Linux高级程序设计》杨宗德著 - Linux多线程编程 - 线程同步机制

C++多线程编程同步技术剖析:临界区,时间,信号量,互斥量

摘要: 多线程同步技术是计算机软件开发的重要技术,本文对多线程的各种同步技术的原理和实现进行了初步探讨。关键词: VC++6.0; 线程同步;临界区;事件;互斥;信号量; 正文 使线程同步   在程序...

C++多线程编程同步技术剖析:临界区,时间,信号量,互斥量

摘要: 多线程同步技术是计算机软件开发的重要技术,本文对多线程的各种同步技术的原理和实现进行了初步探讨。 关键词: VC++6.0; 线程同步;临界区;事件;互斥;信号量; 正文 使...

Linux同步机制(二) - 条件变量,信号量,文件锁,栅栏

Linux同步机制第二弹 - 讲解了条件变量,无名信号量,文件锁,栅栏的基本概念及使用
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)