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;}
阅读全文
0 0
- Linux C 信号、线程同步、线程互斥锁、线程条件变量
- Linux 线程同步---条件变量
- Linux 线程同步---条件变量
- Linux 线程同步---条件变量
- Linux 线程同步---条件变量
- Linux 线程同步---条件变量
- Linux 线程同步---条件变量
- Linux 线程同步---条件变量
- Linux 线程同步---条件变量
- linux线程同步--条件变量
- Linux 线程同步---条件变量
- Linux 线程同步---条件变量 .
- Linux 线程同步---条件变量
- Linux线程同步-----条件变量
- linux线程同步:条件变量
- Linux线程同步--条件变量
- linux线程同步---条件变量
- linux线程同步-条件变量
- lucas定理求大数组合数取模
- struts2统计访问页面人数
- Huffuman树
- Logstash简介
- 36-数组中的逆序对
- Linux C 信号、线程同步、线程互斥锁、线程条件变量
- PLSQL:oracle 集合类型
- Python:二叉搜索树的第k个节点
- 通过HTML5 FileReader实现上传图片预览功能
- c++pair基本用法
- Ubuntu下安装mysql-connector-python
- vue2+element 管理后台 集成解决方案
- 如何用微服务重构应用程序
- Oracle 9i RMAN恢复过程中,归档日志找不到.