线程

代码
#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;
}

原文地址:https://www.cnblogs.com/linyilong3/p/1865732.html