C:用pthreads制作poolthread的方法是什么?

Pit*_*kos 20 c pthreads reusability threadpool

我有一个工作队列,我想建立一个4个线程的池,我可以把我的工作.我所坚持的是如何制作线程并在没有工作的情况下让它们暂停.

JOB QUEUE        | job1 | job2 | job3 | job4 | ..

THREAD POOL      | thread1 | thread2 | thread3 | thread4 |
Run Code Online (Sandbox Code Playgroud)

要创建我目前处于初始化点的线程:

for (t=0; t<num_of_threads; t++){
    pthread_create(&(threads[t]), NULL, doSth2, NULL);
}
Run Code Online (Sandbox Code Playgroud)

num_of_threads = 4且doSth2是一个内部没有任何内容的函数.所以一旦我创建了4个线程并且完成了doSth2,我怎么能给他们新的工作呢,而不会杀死他们?

cni*_*tar 20

线程池的关键是队列.这是我开发的线程池的修改函数.

将元素放入队列中

void queue_add(queue q, void *value)
{
    pthread_mutex_lock(&q->mtx);

    /* Add element normally. */

    pthread_mutex_unlock(&q->mtx);

    /* Signal waiting threads. */
    pthread_cond_signal(&q->cond);
}
Run Code Online (Sandbox Code Playgroud)

从队列中获取元素

void queue_get(queue q, void **val_r)
{
    pthread_mutex_lock(&q->mtx);

    /* Wait for element to become available. */
    while (empty(q))
        rc = pthread_cond_wait(&q->cond, &q->mtx);

    /* We have an element. Pop it normally and return it in val_r. */

    pthread_mutex_unlock(&q->mtx);
}
Run Code Online (Sandbox Code Playgroud)

  • 不久前我知道 - 回答@AlexandreGomes - pthread_cond_wait(来自 man [http://linux.die.net/man/3/pthread_cond_wait])在等待时解锁互斥锁,供其他线程使用,并返回锁定它再次。因此互斥量作为参数传递。 (2认同)

Duc*_*uck 5

作为 cnicutar 答案的替代即兴表演,您可以只使用POSIX 消息队列,它将解决内核中的同步问题。系统调用会产生一些小的开销,这可能是也可能不是问题。它非常小,因为内核正在执行您必须手动执行的所有操作。

消费者线程可以阻塞mq_receive,如果您创建特殊类型的队列消息,则可以轻松告诉线程何时关闭。