【问题标题】:Multi-Thread Programming多线程编程
【发布时间】:2010-04-15 20:15:36
【问题描述】:

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

【问题讨论】:

  • 您可能必须设置一个迷你消息队列,每个线程都会轮询该队列以确定它应该做什么。
  • 没有像 pthread_cond_wait(你想等待的线程)这样的东西----我知道那个函数的用法不正确,但它只是举个例子

标签: c multithreading posix


【解决方案1】:

你的问题很笼统。真正归结为:查看 pthreads 文档。

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

如果您想要让线程 A 等到线程 B 说可以继续,您将需要一个互斥锁和一个条件变量。查看pthread_cond_wait() 和相关函数。

【讨论】:

  • 显然我需要更快地打字。同意 - 特别是在 pthread_cond_wait() 上,我认为这是他们正在寻找的。​​span>
  • 是的,我试图在完成之前暂停一个线程,让另一个线程运行(第二个线程),暂停第二个线程,让第三个线程运行......等等......如果这样的话意义
  • @MRP,正如您所描述的那样,它没有。如果每个线程都必须在另一个线程完成后运行,那么几乎没有理由使用线程。
【解决方案2】:

处理多个线程的常见机制是主/从方法,其中一个线程将任务交给其他线程执行。这种风格的症结,我认为这就是你要理解的,是要意识到即使在从属线程中,每个线程本质上都可以完全控制自己的执行。主线程并没有真正“强迫”其他线程做任何事情,主线程可以发出请求,但从线程必须自愿接受主线程的指示......嗯......所以也许主线程/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

}

当然,这是一个过于简单化的例子,但希望它能给你一个大致的概念。

【讨论】:

  • 所以如果我理解正确,主线程控制一个指针,告诉从线程接下来运行。
  • @MRP:你需要改变你的思考方式——而不是认为主线程告诉从线程执行,主线程将一些工作放在从属的“收件箱”中,并且奴隶在有一些工作要做的时候运行。
  • 好吧,比 kyou 更有意义
猜你喜欢
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2010-11-25
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多