多线程编程

时间:2010-04-15 20:15:37

标签: c multithreading posix

是否存在可以与特定线程关联以使线程运行或等待的函数调用?我的程序中有4个线程,我正试图找出一种方法来告诉任何一个线程在我想要它们时等待或运行。

2 个答案:

答案 0 :(得分:2)

你的问题非常笼统。它真的归结为:查看pthreads文档。

如果您想让线程A等待线程B完成,请查看pthread_join()

如果你想要的是让线程A等到线程B说它可以继续,你将需要一个互斥锁和一个条件变量。查看pthread_cond_wait()及相关功能。

答案 1 :(得分:0)

处理多个线程的常用机制是主/从方法,其中一个线程移交任务以供其他人执行。我认为这种风格的关键是要意识到即使在从属线程中,每个线程本身都可以完全控制自己的执行。主人并没有真正“强迫”其他线程做任何事情,主人可以提出请求,但是奴隶线程必须自愿接受来自主人的指示... hrm ...所以也许主人/ slave在这里用词不当......无论如何,从属线程的常见解决方案是伪代码

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

你可以使用类似下面的结构在C中很容易地实现这个策略(虽然为了这个例子,我正在使用伪c-ish代码)

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

}

当然,这是一个过于简单化的例子,但希望它能给你一般的想法。