Linux C 信号、线程同步、线程互斥锁、线程条件变量

这一周学习 信号处理,线程pthread的创建、同步、阻塞、激发的情形

信号量的处理函数

#include "func.h"


void sig(int signum)
{
// 同一个信号量最多执行两遍
    printf("before sleep,I am signal %d\n",signum);
    sleep(3);
    printf("after sleep,I am signal %d\n",signum);
}
int main()
{
    //捕获2、3号信号,对应同一个handle函数
    signal(SIGINT,sig);
    signal(SIGQUIT,sig);
    while(1);
}

线程同步 join cancel

//create 传递子线程参数 再由join阻塞子线程获取返回值
#include "func.h"
void* func(void *p){
        long *p1;
        p1=(long*)p;
        printf("i=%ld\n",*p1);
        (*p1)++;
        pthread_exit((void*)*p1);
       // pthread_exit(p1);
}
int main(){
        pthread_t pthid;
        long i=1;
        pthread_create(&pthid,NULL,func,&i);
        pthread_join(pthid,(void**)&i);
        printf("final=%ld\n",i);
}



//子线程read 是cancelnation point 是会被pthread_cancel掉。同时会被pthread_cleanup 进行资源的清理
#include "func.h"
void cleanup1(void* p)
{
    printf("start cleanup\n");
    free(p);
    printf("cleanup over\n");
}

void* threadfunc(void *p)
{
    char *p1;
    printf("child thread,please input something\n");
    p1=(char*)malloc(20);
    pthread_cleanup_push(cleanup1,p1);
    read(0,p1,sizeof(p1));    //这里被cancel掉,后面无法被执行
    //业务逻辑
    pthread_exit((void*)5);
    pthread_cleanup_pop(1);
    printf("see me?\n");
}
//子线程被cancel,主线程回收子线程资源
int main()
{
    pthread_t pthid;
    int ret;
    ret=pthread_create(&pthid,NULL,threadfunc,NULL);
    sleep(1);   //保证子线程已经创建
    ret=pthread_cancel(pthid);  
    long l=0;
    pthread_join(pthid,(void**)&l);
    printf("I am main thread,chid exit=%ld\n",l);
    return 0;
}

线程互斥锁 mutex


//使用mutex 线程互斥锁保护共享资源  区别信号量
#include "func.h"
#define N 10000000
typedef struct{
    int s;
    pthread_mutex_t mutex1;
}sdata;
void* threadfunc(void* p)
{
    sdata *s=(sdata*)p;
    int i;
    for(i=0;i<N;i++)
    {   
        pthread_mutex_lock(&s->mutex1);
        s->s=s->s+1;
        pthread_mutex_unlock(&s->mutex1);
    }
    pthread_exit(NULL);
}

int main()
{
    int i;
    //包括 共享变量sum  锁mutex
    sdata s;
    int ret;
    pthread_t pthid;
    s.s=0;
    //NULL 表示互斥锁属性为默认值
    ret=pthread_mutex_init(&s.mutex1,NULL);
    pthread_create(&pthid,NULL,threadfunc,&s);
    for(i=0;i<N;i++)
    {
        pthread_mutex_lock(&s.mutex1);
        s.s=s.s+1;
        pthread_mutex_unlock(&s.mutex1);
    }
    // 等待子线程的返回
    pthread_join(pthid,NULL);
    printf("sum=%d\n",s.s);
    return 0;
}

线程条件变量 cond wait signal

//cond_signal 激发条件变量 结束子线程的cond_wait 实现子线程的同步

#include "func.h"

typedef struct{
    pthread_mutex_t mutex;
    pthread_cond_t cond;
}data;
void* threadfunc(void* p)
{
    data *d=(data*)p;
    pthread_mutex_lock(&d->mutex);
    printf("child thread in lock\n");
    pthread_cond_wait(&d->cond,&d->mutex);
    printf("get signal,child wakeup\n");
    pthread_mutex_unlock(&d->mutex);
    pthread_exit(NULL);
}

int main()
{
    data t;
    pthread_mutex_init(&t.mutex,NULL);
    pthread_cond_init(&t.cond,NULL);
    pthread_t pthid;
pthread_create(&pthid,NULL,threadfunc,&t);
    usleep(50);
    pthread_cond_signal(&t.cond);

    printf("send signal success\n");
    pthread_join(pthid,NULL);
    printf("I am main thread\n");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值