线程和进程的区别

4
我对线程和fork不太熟悉,为了更好地理解它们,我编写了一些简单的程序。其中一个小程序我编写了两个程序,一个在两个进程上打印计数器,另一个在两个线程上。 我注意到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程序?即计数器的打印交织。

2个回答

1
你正在走一条错误的路。你应该学习的教训是不要试图超越操作系统调度程序。无论你做什么-处理调度、优先级或任何旋钮-你都不能可靠地做到这一点。
你已经发现了同步机制-互斥量、信号量、条件变量、线程屏障等的需要。你想做的正是它们存在的原因,也应该用它们来实现你的目标。
在你的最后一个问题中,pthread_join从死亡的可连接(即未分离)线程中回收一些资源,并允许你检查过期线程中的任何返回变量。在你的程序中,它们大多作为阻塞机制。也就是说,主函数将在这些调用上阻塞,直到线程过期。如果没有pthread_joins,你的主函数将结束,进程将死亡,包括你创建的线程。如果你不想加入这些线程,在主函数中没有做任何有用的事情,那么使用pthread_exit在主函数中,这将允许主函数退出,但线程继续处理。

0
首先,fork会创建第二个进程,而创建线程则在同一进程中创建“可调度的工作单元”。
让两个不同的进程交错运行通常是让操作系统运行的简单问题。但是,在一个进程内部,您需要更多地了解操作系统如何选择运行几个线程中的哪一个。
您可能可以通过从每个线程调用不同的睡眠时间来人为地使线程的输出交错。也就是说,创建线程A(将其编码以输出一行,然后休眠100),然后创建线程B(将其编码以输出一行,然后休眠50等)。
我理解您想要看到线程如何并行运行,类似于进程。但是,这是真正的要求还是只是一个“动物园”请求呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接