我想在C中并行编程,我应该避免使用pthread_join()吗?

时间:2016-11-27 14:49:25

标签: c multithreading pthreads sequential

我想创建多个线程并在创建它们的同时启动它,以使代码尽可能快地完成 我试图这样做:

for (i = 1; i < nbClients+1; i++)
{
    pthread_create(&tClient, NULL, procedureClient, &i);
    pthread_join(tClient, NULL);

    free(clients[i].panier); //Libération de la mémoire pour chaque panier
}

如果我执行pthread_join,主线程被暂停,因此它是顺序的,所以如果我这样做:

for (i = 1; i < nbClients+1; i++)
{
    pthread_create(&tClient, NULL, procedureClient, &i);

    free(clients[i].panier); //Libération de la mémoire pour chaque panier
}

这个执行并行吗?如果我的印刷品出现混乱,这是正常的吗? (我认为这是正常的,但我更愿意问)

由于

1 个答案:

答案 0 :(得分:2)

存在以下问题。

  1. 您需要为不同的线程使用不同的pthread_t句柄。
  2. 为不同的线程需要不同的arg变量。
  3. 您应该在创建所有线程后调用pthread_join()。 pthread_join()将阻塞调用线程,直到另一个线程退出。这将等待该线程退出。
  4. pthread_t tClient[MAX_NUM_THREADS];
    int       arg[MAX_NUM_THREADS] = {0};
    
    for (i = 0; i < nbClients; i++)
    {
        arg[i] = i+1; //Changed your for loop.
        pthread_create(&(tClient[i]), NULL, procedureClient, (void*)&(arg[i]));
    }
    
    /* Other code. */
    
    for (i = 0; i < nbClients; i++)
    {
        pthread_join(tClient[i], NULL); //Will wait for ith thread to exit.
    
        free(clients[i].panier); //Libération de la mémoire pour chaque panier
    }
    
      

    这个执行并行吗?如果我的printf在a中是正常的   混乱? (我认为这是正常的,但我更愿意问)

    现在执行是并行的。 不同线程中的打印可能会有不同的顺序。这取决于在什么时间安排哪个线程。 您可以使用互斥锁,信号量,条件变量来同步线程。等