Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1021687
  • 博文数量: 297
  • 博客积分: 11721
  • 博客等级: 上将
  • 技术积分: 3431
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 10:21
文章分类

全部博文(297)

文章存档

2016年(9)

2011年(71)

2010年(137)

2009年(80)

分类: C/C++

2009-11-20 16:43:27

#include

int pthread_atfork(void (*prepare)(void),void (*parent)(void), void (*child)(void));

在有多个线程的子进程中创建进程只继承进程的当前线程.

在线程中创建进程的步骤是:
(1)父进程获得所有的锁
(2)子进程获得所有的锁
(3)父进程释放它的锁
(4)子进程释放它的锁

#include
#include
#include
#include

pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;

void prepare(void)
{
    printf("prepareing locks...\n");
    pthread_mutex_lock(&lock1);
    pthread_mutex_lock(&lock2);
}
void parent(void)
{
    printf("parent unlocking 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)
{
    int err;
    pid_t pid;
   
    printf("thread started...\n");
    pthread_atfork(prepare,parent,child);
    sleep(2);
    printf("thread  about to fork...\n");
    if((pid=fork())<0)
        printf("fork error: %s\n",strerror(errno));
    else if(pid==0)
        printf("child returned from fork\n");
    else
        printf("parent returned from fork\n");
   
    pause();
    pthread_exit((void *)0);
}
void * thr_fn1(void * arg)
{
    pause();
    pthread_exit((void *)0);
}
int main(int argc,char ** argv)
{
           
    pthread_t tid,tid1;
    pthread_create(&tid,NULL,thr_fn,NULL);
    pthread_create(&tid1,NULL,thr_fn1,NULL);
    pthread_join(tid,NULL);
    pthread_join(tid1,NULL);

    return 0;
}
注意: 编译的时候要用 -pthread ,而不是 -lpthread
debian:/home/linux# ./a.out
thread started...
thread  about to fork...
prepareing locks...
child unlocking locks...
child returned from fork
parent unlocking locks...
parent returned from fork

查看a.out的线程数:
debian:/home/linux# ps -ef -L | awk '/UID|a.out/ {print $0}' | grep -v "awk"
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root      5517  5484  5517  0    3 17:18 pts/0    00:00:00 ./a.out
root      5517  5484  5518  0    3 17:18 pts/0    00:00:00 ./a.out
root      5517  5484  5519  0    3 17:18 pts/0    00:00:00 ./a.out
root      5520  5517  5520  0    1 17:18 pts/0    00:00:00 ./a.out


阅读(570) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~