线程间的同步----利用信号量来实现

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

sem_t bin_sem;
void *thread_funtion(void *arg);
char work_area[1024];

int main() {
	pthread_t a_thread;
	int res;
	void *thread_result;
	res = sem_init(&bin_sem, 0, 0);
	if(res != 0) {
		perror("初始化信号量失败");
		exit(EXIT_FAILURE);
	}
	res = pthread_create(&a_thread, NULL, thread_funtion, NULL);
	if(res != 0) {
		perror("线程创建失败");
		exit(EXIT_FAILURE);
	}
	printf("请输入要传送的信息,输入'end'退出\n");
	while(strncmp("end", work_area, 3) != 0) {
		fgets(work_area, 1024, stdin);
		sem_post(&bin_sem);				// 将信号量加1
	}
	printf("\n等待线程结束...\n");
	res = pthread_join(a_thread, &thread_result);                // 等待线程结束
	if (res != 0) {                                                   // 判断结束线程是否有错误
		perror("线程结束失败");
	    exit(EXIT_FAILURE);
	}
	printf("线程结束\n");
	sem_destroy(&bin_sem);                           			 // 清除信号量                                                    // 清除信号量
	exit(EXIT_SUCCESS);
}

void *thread_funtion(void *arg) {
	sem_wait(&bin_sem);				// 等待信号量变化,将信号量减1
	while(strncmp("end", work_area, 3) != 0) {			// 判断收到的信息是否是“end”
		printf("收到%lu个字符\n", strlen(work_area) - 1);          // 输出收到信息的字符数量
		sem_wait(&bin_sem);			// 等待信号量变化,将信号量减1
	}
	pthread_exit(NULL);					// 结束线程
}

时间: 2024-08-25 14:45:53

线程间的同步----利用信号量来实现的相关文章

vc++高级班之多线程篇[7]---线程间的同步机制②

//示例代码: CStringArray g_ArrString; UINT __cdecl ThreadProc(LPVOID lpParameter) { int startIdx = (int)lpParameter; for (int idx = startIdx; idx < startIdx+100; ++idx) { CString str; str.Format(_T("%d"), idx); g_ArrString.Add(str); } return 0; }

vc++高级班之多线程篇[6]---线程间的同步机制①

①.线程同步的必要性: int g_Num = 0; UINT __cdecl ThreadProc(LPVOID lpParameter) { for (int idx = 0; idx < 100; ++idx) { g_Num = g_Num+1; CString strNum; strNum.Format(_T("%d"), g_Num); g_Num = g_Num-1; } return 0; } void CThreadTestDlg::OnBnClickedBtn

线程间的同步----利用互斥量来实现

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h> // 包含线程库 #include <semaphore.h> // 包含信号量库 void *thread_function(void *arg); // 定义线程函数原型 pthread_mutex_t work_mutex; //

Linux 线程间的同步与互斥

在线程并发执行的时候,我们需要保证临界资源的安全访问,防止线程争抢资源,造成数据二义性. 线程同步: 条件变量 为什么使用条件变量? 对临界资源的时序可控性,条件满足会通知其他等待操作临界资源的线程,类似信号. 场景:T-DAY展会排队参观/生产者消费者模型 条件变量是什么? 是一种同步机制,一个线程用于修改这个变量使其满足其它线程继续往下执行的条件,其它线程则接收条件已经发生改变的信号. 条件变量操作? 初始化和销毁    pthread_cond_wait 条件不满足 会释放锁并阻塞等待 ,

嵌入式开发之hi3519---进程线程间的同步和互斥,条件变量、信号了、互斥锁等

sem_post 最安全 sem  有序,会卡顿 阻塞 mutex  无序,不能同步 http://blog.chinaunix.net/uid-20671208-id-4935154.html https://www.cnblogs.com/ngnetboy/p/3521547.html http://www.jianshu.com/p/1e59f0970bf5 http://blog.csdn.net/jenny8080/article/details/52094140

线程间同步之信号量实现环形buf

一.概述: 信号量是一个非负整数的计数器,它通过计数器来实现多线程对临界资源的顺序访问,从而实现线程间的同步.它与进程间通信的信号量不同,进程间通信的信号量是一个信号量集,而线程间同步的信号量是一个信号.还有一点,就是对信号量的操作是原子的. 信号量与互斥锁的区别: (1).互斥锁的值只能是0或1,而信号量的值为非负整数. (2).互斥锁用与实现线程间的互斥,而信号量用于实现线程间的同步. (3).互斥锁的加锁和解锁必须由同一个线程分别对应使用,而信号量可以由一个线程得到,另一个线程释放. 下面

Linux进程间通信与线程间同步详解(全面详细)

引用:http://community.csdn.net/Expert/TopicView3.asp?id=4374496linux下进程间通信的几种主要手段简介: 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身

浅析线程间通信三:Barriers、信号量(semaphores)以及各种同步方法比较

之前的文章讨论了互斥量.条件变量.读写锁和自旋锁用于线程的同步,本文将首先讨论Barriers和信号量的使用,并给出了相应的代码和注意事项,相关代码也可在我的github上下载,然后对线程各种同步方法进行了比较. Barriers Barriers是一种不同于前面线程同步机制,它主要用于协调多个线程并行(parallel)共同完成某项任务.一个barrier对象可以使得每个线程阻塞,直到所有协同(合作完成某项任务)的线程执行到某个指定的点,才让这些线程继续执行.前面使用的pthread_join

RT-Thread的线程间同步

禁止系统调度上一节< 多线程导致的临界区问题>中由于 test1 线程被 test2 线程打断,才导致了我们没有得到预期的结果,我们一般可通过关闭中断和调度器上锁这两种简单的途径来禁止系统调度,防止线程被打断,从而保证临界区不被破坏. 1. 关闭中断线程中关闭中断保护临界区的结构如下: #include <rtthread.h> #include <stm32f10x.h> #include "test.h" rt_uint32_t g_tmp;/*