线程

复制代码
代码
#include <unistd.h>
#include
<pthread.h>
#include
<stdio.h>

void *thr_fn1(void *arg)
{
printf(
"thread 1 returning\n");
return ((void*)1);
}

void *thr_fn2(void *arg)
{
printf(
"thread 2 returning\n");
return ((void *)2);
}

int main(void)
{
int err;
pthread_t tid1,tid2;
void *tret;

err
=pthread_create(&tid1,NULL,thr_fn1,NULL);
err
=pthread_create(&tid2,NULL,thr_fn2,NULL);
err
=pthread_join(tid1,&tret);
printf(
"thread 1 exti code %d\n",(int)tret);
err
=pthread_join(tid2,&tret);
printf(
"thread 2 exit code %d\n",(int)tret);
return 0;
}
复制代码

 

复制代码
代码
#include <unistd.h>
#include
<stdio.h>
#include
<pthread.h>
#include
<signal.h>
#include
<stdlib.h>

int quitflag;
sigset_t mask;
pthread_mutex_t
lock=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t wait
=PTHREAD_COND_INITIALIZER;

void *thr_fn(void *arg)
{
int err,signo;
while(1)
{
err
=sigwait(&mask,&signo);
switch(signo)
{
case SIGINT:
printf(
"\nSIGINT\n");
break;
case SIGQUIT:
pthread_mutex_lock(
&lock);
quitflag
=1;
pthread_mutex_unlock(
&lock);
pthread_cond_signal(
&wait);
exit(
0);
default:
printf(
"unexpected signal %d\n",signo);
exit(
1);
}
}
}

int main(void)
{
int err;
sigset_t oldmask;
pthread_t tid;
sigemptyset(
&mask);
sigaddset(
&mask,SIGINT);
sigaddset(
&mask,SIGQUIT);
if((err=pthread_sigmask(SIG_BLOCK,&mask,&oldmask)) != 0)
{
printf(
"SIG_BLOCK error\n");
return 1;
}

err
=pthread_create(&tid,NULL,thr_fn,0);
pthread_mutex_lock(
&lock);
while(quitflag==0)
pthread_cond_wait(
&wait,&lock);
pthread_mutex_unlock(
&lock);
quitflag
=0;
if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
{
printf(
"SIG_SETMASK error\n");
}
}
复制代码

 

复制代码
代码
#include <unistd.h>
#include
<stdio.h>
#include
<pthread.h>

void cleanup(void *arg)
{
printf(
"cleanup:%s\n",(char *)arg);
}

void *thr_fn1(void *arg)
{
printf(
"thread 1 start\n");
pthread_cleanup_push(cleanup,(
void*)"thread 1 first handler");
pthread_cleanup_push(cleanup,(
void*)"thread 1 second handler");
printf(
"thread 1 push complete\n");
if(arg)
return ((void *)1);
pthread_cleanup_pop(
0);
pthread_cleanup_pop(
0);
return ((void *)1);
}

void *thr_fn2(void *arg)
{
printf(
"thread 2 start\n");
pthread_cleanup_push(cleanup,(
void*)"thread 2 first handler");
pthread_cleanup_push(cleanup,(
void*)"thread 2 second handler");
printf(
"thread 2 push complete\n");
if(arg)
pthread_exit((
void*)2);
pthread_cleanup_pop(
0);
pthread_cleanup_pop(
0);
pthread_exit((
void *)2);
}

int main(void)
{
int err;
pthread_t tid1,tid2;
void *tret;

err
=pthread_create(&tid1,NULL,thr_fn1,(void*)1);
err
=pthread_create(&tid2,NULL,thr_fn2,(void*)2);
err
=pthread_join(tid1,&tret);
printf(
"thread 1 exit code %d\n",(int)tret);
err
=pthread_join(tid2,&tret);
printf(
"thread 2 exit code %d\n",(int)tret);
return 0;
}
复制代码

 

复制代码
代码
#include <unistd.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<pthread.h>

pthread_mutex_t lock1
=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2
=PTHREAD_MUTEX_INITIALIZER;

void prepare(void)
{
printf(
"preparing locks...\n");
pthread_mutex_lock(
&lock1);
pthread_mutex_lock(
&lock2);
}

void parent(void)
{
printf(
"parent unlock locks...\n");
pthread_mutex_unlock(
&lock1);
pthread_mutex_unlock(
&lock2);
}

void child(void)
{
printf(
"child unlocking locks...\n");
pthread_mutex_unlock(
&lock1);
pthread_mutex_unlock(
&lock2);
}

void *thr_fn(void *arg)
{
printf(
"thread started...\n");
pause();
return 0;
}

int main(void)
{
int err;
pid_t pid;
pthread_t tid;

err
=pthread_atfork(prepare,parent,child);
pthread_create(
&tid,NULL,thr_fn,0);

sleep(
2);
printf(
"parent about to fork...\n");
pid
=fork();
if(pid==0)
printf(
"child return form fork\n");
else
printf(
"parent returned from fork\n");
return 0;
}
复制代码

 

posted @   linyilong  阅读(262)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示