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

来源:互联网 发布:php拼接字符串 编辑:程序博客网 时间:2024/05/16 18:48

这一周学习 信号处理,线程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 10000000typedef 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;}
原创粉丝点击