首页 » 技术分享 » Linux中线程同步信号发送与接收总结

Linux中线程同步信号发送与接收总结

 

    在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中线程同步信号发送与接收总结,转载请注明来源!

0