这一周学习 信号处理,线程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;
}