Запуск pthreads одновременно - PullRequest
3 голосов
/ 18 октября 2010

Каковы различные способы обеспечения того, чтобы все pthreads все запускались одновременно?

Я мог бы найти только один способ, т.е.инициализация barrier в главном потоке, а затем ожидание во вновь созданных pthreads.

Ответы [ 2 ]

6 голосов
/ 18 октября 2010

Это в значительной степени точно , как я делал это в прошлом.

main:
    claim mutex
    for each desired thread:
        start child
    release mutex
    :

child:
    claim mutex
    release mutex
    :

Обратите внимание, что на самом деле это не гарантирует, что все потоки были запущены до того, как первый начнет что-то делать, просто основной поток создал их.

Для этого вы можете использовать что-то вроде следующего метода:

main:
    claim mutex
    set unstarted to 0
    for each desired thread:
        start child
        add 1 to unstarted
    release mutex
    :

child:
    claim mutex
    subtract 1 from unstarted
    while unstarted > 0:
        release mutex
        yield // if necessary
        claim mutex
    release mutex
    :

Независимо от того, какую инициализацию должен выполнить поток, чтобы считать его запущенным, произойдет между claim и subtract.


Из дальнейших исследований я вижу, что барьеры на самом деле являются более элегантным способом сделать это. На самом деле они не были доступны в тех реализациях pthread, которые я использовал, поэтому мой код может показаться немного многословным.

Однако я оставлю это как есть на случай, если кто-то использует pthreads до v6 или другой метод многопоточности (без барьеров), и потому что, как задан вопрос, это равно другой способ сделать это.

0 голосов
/ 18 октября 2010

Вы можете использовать pthread_cond_broadcast.Они не будут запущены полностью одновременно из-за мьютекса.Вы можете попытаться использовать разные мьютексы для каждого потока, но использование разных мьютексов для одной и той же переменной условия не определено.

#include <pthread.h>

pthread_mutex_t join_mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void thread_function (void *param) {
    pthread_mutex_lock(&join_mut);
    pthread_cond_wait(&cond, &join_mut);
    pthread_mutex_unlock(&join_mut); 

    /* Thread work here */
}

enum { threads = 16 };

int main() {
  int i;
  pthread_t thread_table[threads];

  for(i = 0; i < threads; i++) {
    pthread_create(&(thread_table[i]), NULL, thread_function, NULL);
  }

  /* Wait for all threads to be queued */

  pthread_cond_broadcast(&cond);
}
...