线程

#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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的设计模式综述