4

我对线程和叉子比较陌生。所以为了更好地理解它们,我一直在编写简单的程序。我编写了两个程序的小程序之一,一个用于在两个进程上打印计数器,另一个用于两个线程。我注意到的是,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 程序?即计数器打印交织。

4

2 回答 2

1

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

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

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

于 2013-09-09T23:38:55.387 回答
0

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

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

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

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

于 2013-09-09T23:02:31.200 回答