【问题标题】:Thread and Forks螺纹和叉子
【发布时间】:2013-09-09 20:32:56
【问题描述】:

我对线程和分叉比较陌生。所以为了更好地理解它们,我一直在编写简单的程序。其中一个小程序我写了两个程序,一个在两个进程上打印一个计数器,另一个有两个线程。 我注意到的是,fork 会交错打印计数器,而线程会打印一个线程的计数器,然后是其他线程的计数器。所以线程不是那么并行,而是表现得更串行为什么呢?难道我做错了什么?

另外,pthread_join 到底是做什么的?即使我不执行 pthread_join,程序也会以类似方式运行。

这是我的线程代码

void * thread1(void *a){
    int i =0;
for(i=0; i<100; i++)
    printf("Thread 1      %d\n",i);
}

void * thread2(void *b){
int i =0;
for(i=0; i<100; i++)
    printf("Thread 2    %d\n", i);
}

int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,thread1, NULL);
pthread_create(&tid2,NULL,thread2, NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}

这是我的 fork 代码

int main(void)
{
pid_t childPID;
childPID = fork();

if(childPID >= 0) // fork was successful
{
    if(childPID == 0) // child process
    {   int i;
    for(i=0; i<100;i++)
        printf("\n Child Process Counter : %d\n",i);

    }
    else //Parent process
    {
        int i;
        for(i=0; i<100;i++)
            printf("\n Parent Process Counter : %d\n",i);
    }
}
else // fork failed
{
    printf("\n Fork failed, quitting!!!!!!\n");
    return 1;
}

return 0;
}

编辑: 如何使线程程序的行为更像 fork 程序?即计数器打印交织。

【问题讨论】:

    标签: c pthreads fork


    【解决方案1】:

    你在这里走的是一条糟糕的路。你应该学习的教训是不要尝试去思考操作系统调度程序。无论您做什么 - 处理计划、优先级或您转动的任何旋钮 - 您都无法可靠地完成它。

    您已经发现了对同步机制的需求 - 互斥锁、信号量、条件变量、线程屏障等。您想要做的是它们存在的确切原因以及您应该使用什么来实现您的目标。

    关于您的最后一个问题,pthread_join 从已死、可连接(即未分离)的线程中回收一些资源,并允许您检查过期线程中的任何返回变量。在您的程序中,它们主要用作阻塞机制。也就是说,main 将阻塞这些调用,直到线程到期。如果没有pthread_joins,您的main 将结束并且进程将终止,包括您创建的线程。如果您不想加入线程并且在 main 中没有做任何有用的事情,那么请在 main 中使用 pthread_exit,因为这将允许 main 退出但线程继续处理。

    【讨论】:

      【解决方案2】:

      首先,fork 创建第二个进程,同时创建线程在同一进程内创建一个“可调度的工作单元”。

      让两个不同的进程交错通常是让操作系统运行的简单问题。但是,在一个进程中,您需要更多地了解操作系统如何选择运行多个线程中的哪一个。

      您可以人为地通过从每个线程调用 sleep 不同时间来获得要交错的线程的输出。即创建线程A(编码为输出一行,然后休眠100)然后创建线程B(编码为输出一行,然后休眠50等)

      我理解想看看线程如何并行运行,类似于进程。但是,这是一个真正的要求还是只是一个“动物园”要求?

      【讨论】:

        猜你喜欢
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多