fork命令是否适用于多线程应用程序?

时间:2014-07-17 14:24:44

标签: c++ c multithreading fork

我试图分叉多线程应用程序。似乎fork没有复制我的第二个帖子。

这是我的代码:

#include <stdlib.h>
#include <pthread.h>
#include <iostream>
#include <linux/unistd.h>
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <sys/ioctl.h>

using namespace std;

void Loop(const char* zThread)
{
    while (true)
    {
        sleep(2);
        cout << "LOOP : " << zThread << " : " << getpid() << endl;
    }
}

void *MyFunction(void *pData)
{
    Loop("Second");
};

int main()
{
    pthread_t thread1;

    pthread_create(&thread1, NULL, MyFunction, NULL);

    int iPID = fork();

    if (iPID == 0)
        cout << "Child : " << getpid() << endl;
    else
        cout << "Parent : " << getpid() << endl;

    Loop("First");

    return EXIT_SUCCESS;
};

它提供以下输出,该输出不包含子进程的第二个线程写入的任何信息。

test_1/ss> ./a.out
Parent : 11877
Child : 11879
LOOP : Second : 11877
LOOP : First : 11877
LOOP : First : 11879
LOOP : Second : 11877
LOOP : First : 11877
LOOP : First : 11879
LOOP : Second : 11877
LOOP : First : 11877
LOOP : First : 11879
LOOP : Second : 11877
LOOP : First : 11877
LOOP : First : 11879
LOOP : Second : 11877
LOOP : First : 11877
LOOP : First : 11879
LOOP : Second : 11877
LOOP : First : 11877
LOOP : First : 11879

第二个帖子发生了什么?

2 个答案:

答案 0 :(得分:5)

只分叉调用线程。

来自docs

  

应使用单个线程创建进程。如果是多线程的   进程调用fork()时,新进程应包含一个副本   调用线程及其整个地址空间,可能包括   互斥和其他资源的状态。因此,为了避免错误,   子进程可能只执行异步信号安全操作,直到   调用其中一个exec函数的时间。

答案 1 :(得分:3)

  

man fork

     
      
  • 子进程是使用单线程创建的 - 一个   那叫fork()。整个病毒 -         父项的tual地址空间在子项中复制,包括互斥体的状态,con         dition变量和其他pthreads对象;使用pthread_atfork(3)可能会有所帮助         处理这可能导致的问题。
  •