Многопоточное программирование - PullRequest
0 голосов
/ 16 апреля 2010

Есть ли вызов функции, который может ассоциироваться с конкретным потоком, чтобы заставить поток работать или ждать? У меня есть 4 потока в моей программе, и я пытаюсь найти способ сообщить любому из потоков, чтобы он ожидал или запустил, когда я этого хочу.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2010

Ваш вопрос довольно общий. Это действительно сводится к: Просмотрите документацию pthreads.

Если вы хотите, чтобы поток A ждал завершения потока B, проверьте pthread_join().

Если вы хотите, чтобы поток A ожидал, пока поток B не скажет, что можно продолжить, вам понадобится мьютекс и условная переменная. Проверьте pthread_cond_wait() и связанные функции.

0 голосов
/ 16 апреля 2010

Распространенным механизмом обработки нескольких потоков является подход «ведущий / ведомый», когда один поток передает задачи другим. Суть этого стиля, который, я думаю, заключается в том, чтобы вы поняли, что даже в подчиненных потоках, каждый поток по сути имеет полный контроль над своим собственным исполнением . Мастер не «заставляет» другие потоки делать что-либо, мастер может сделать запрос, но подчиненный поток должен добровольно принять направление от мастера ... хм ... так что, возможно, мастер / раб здесь нехорошо ... Во всяком случае, общее решение для подчиненных потоков - в псевдокоде

while (!should_exit):
    while (!have_something_to_do):
        wait_for_something_to_do()
    do_the_thing_i_was_waiting_for()

Вы можете довольно легко реализовать эту стратегию в C, используя структуру, подобную следующей (хотя для примера я прибегаю к псевдо-c-иш-коду)

struct Slave {
    Mutex              thread_lock;
    ConditionVariable  thread_cv;
    int                exit_flag;
    void             (*thread_operation)();
};

void slave_thread( Slave * slave ) {
    while( !exit_flag )
    {
        lock( thread_lock );
        while( slave->thread_operation == NULL )
            slave->thread_cv.wait( thread_lock );
        unlock( thread_lock );
        (*slave->thread_operation)(); // do the master's bidding...
    }
}

void master_thread()
{
   Slave slave1;
   Slave slave2;

   slave1.thread_operation = NULL;
   slave2.thread_operation = NULL;

   // create the threads. They'll immediately block on the condition variable

   slave1.thread_operation = some_function_pointer;
   slave2.thread_operation = some_other_function_pointer;

   notify_one( slave1.thread_cv ) // Now that the function pointers are set, wake
   notify_one( slave2.thread_cv ) // the slave threads

}

Конечно, это слишком упрощенный пример, но, надеюсь, он даст вам общую идею.

...