在Linux中关于线程同步信号发送主要分为4步(默认有一个主线程和一个子线程):
(1)首先包含头文件,再创建一个信号量,并初始化之:
#include <semaphore.h>
sem_t sem;//创建信号量
sem_init(&sem,0,0);//初始化信号量
(2)主线程发送信号:
sem_post(&sem);
(3)子线程接收信号:
sem_wait(&sem);
(4)最后摧毁信号
sem_destroy(&sem);
分析总结:过程创建主要分为这四部,虽然简单,但使用时注意信号发送与接收的位置。
例如:
#include <iostream>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
using namespace std;
unsigned int flag=0;
char buf[200];
sem_t sem;
//子线程作用是统计字符个数并打印
void *func(void *arg){
//子线程首先有个循环
//循环中阻塞在等待主线程激活的时候,子线程被激活后就去获取buf中的字符长度,然后打印;
//完成后再次被阻塞
while(flag==0){
//if(sem_wait(&sem)==0){
sem_wait(&sem);
cout<<"本次输入了"<<strlen(buf)<<"个字符"<<endl;
memset(&buf,0,sizeof(buf));
}
}
int main(){
int ret=-1;
pthread_t th=-1;
sem_init(&sem,0,0);
ret=pthread_create(&th,NULL,func,NULL);
if(ret!=0){
cout<<"error!"<<endl;
return -1;
}
cout<<"请输入字符:"<<endl;
while(cin>>buf){
//去比较用户输入的是不是end,如果是则退出,如果不是则继续
if(strncmp(buf,"end",3)){
sem_post(&sem);
}
else {
flag=1;
sem_post(&sem);//如果不在break结束前发送子线程一个sem信号,子线程会停留在死循环中,主线程就不能够回收子线程中的资源
break;
}
}
//主线程在收到用户输入的字符串,并且确认不是end后就去发信号激活子线程来计数。
//子线程被阻塞,主线程可以激活,这就是线程的同步问题。
//信号量就可以用来实现这个线程同步
cout<<"等待回收子线程"<<endl;
ret=pthread_join(th,NULL);
if(ret!=0){
cout<<"pthread_join error"<<endl;
return -1;
}
cout<<"回收子线程成功"<<endl;
sem_destroy(&sem);
return 0;
}
转载自原文链接, 如需删除请联系管理员。
原文链接:Linux中线程同步信号发送与接收总结,转载请注明来源!