English 中文(简体)
同时启动pthread
原标题:Starting pthreads simultaneously

确保一堆pthread同时启动的不同方法是什么?

我只能找到一种方法,即在主线程中初始化屏障,然后在新创建的pthread中等待它。

最佳回答

我过去就是这么做的。

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
    :

线程必须进行的任何初始化都将发生在声明减法之间。


我从进一步的调查中看到,障碍实际上是一种更优雅的方式。它们在我使用的pthread实现中实际上并不可用,这就是为什么我的代码看起来有点冗长的原因。

然而,我将保持原样,除非有人使用v6之前的pthreads或不同的线程方法(没有障碍),因为正如所问的那样,这是一种不同的方式。

问题回答

您可以使用pthread_cond_broadcast。由于互斥,它们不会完全同时启动。您可以尝试为每个线程使用不同的互斥体,但对同一个条件变量使用不同的mutex是未定义的。

#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);
}




相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签