【问题标题】:I want to program in parallel in C, should i avoid to use pthread_join()?我想在 C 中并行编程,我应该避免使用 pthread_join() 吗?
【发布时间】:2016-11-27 14:49:25
【问题描述】:

我想创建多个线程并在创建它们的同时启动它,以便代码以最快的速度运行 我试着这样做:

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
}

这个执行是并行的吗?如果我的 printf 有问题,这正常吗? (我认为这很正常,但我更愿意问)

谢谢

【问题讨论】:

  • 哦,对不起,伙计,我忘了脱线!已编辑
  • 在创建第二个线程之前,您正在第一个线程上进行连接。这可能是最快的,因为它可以防止线程同时在不同的内核上运行,这对缓存更好。
  • 是的,也许是的,但我有一个任务,我的代码必须是并行编程,所以线程必须同时运行,不是吗?如果我使用 phthread_join,代码就不能再并行运行了,不是吗?

标签: c multithreading pthreads sequential


【解决方案1】:

存在以下问题。

  1. 您需要为不同的线程设置不同的 pthread_t 句柄。
  2. 不同线程需要不同的 arg 变量。
  3. 您应该在创建所有线程后调用 pthread_join()。 pthread_join() 将阻塞调用线程,直到另一个线程退出。这将等待该线程退出。

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 在 紊乱? (我认为这很正常,但我更愿意问)

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

【讨论】:

  • 是的,我想过尝试这个,但如果我使用 pthread_join,这个过程还能并行吗??
  • @Henleyn 更新了我的答案。它与创建的线程的执行无关。调用 pthread_join() 的线程将被阻塞。
  • 好吧没问题,但为什么对“arg”有用,我不明白?
  • 如你所知,pthread_create() 的最后一个参数是一个空指针,它被传递给thread_function。您正在将 i 的地址传递给所有线程,并且 i 在 for 循环中有所不同。因此,在 thread_function 读取 i 的值并将其存储在本地(我假设您正在这样做)之前,可能会发生 for 循环可能正在更改它。所以最好为不同的线程传递不同的地址。
猜你喜欢
  • 2018-06-16
  • 2011-03-26
  • 2012-10-14
  • 1970-01-01
  • 2010-09-23
  • 2011-12-31
  • 2021-06-03
  • 1970-01-01
  • 2015-04-16
相关资源
最近更新 更多