【问题标题】:pthreads - force thread to runpthreads - 强制线程运行
【发布时间】:2011-06-14 19:14:25
【问题描述】:

我有一个从主线程调用的函数:

void create_thread() {    
    pthread_t bg_thread;
    pthread_create(&bg_thread, NULL, run_in_background, NULL);

    //wait here
    pthread_mutex_lock(&MAIN_MUTEX);
    pthread_cond_wait(&wakeUpMainThread, &MAIN_MUTEX);
    pthread_mutex_unlock(&MAIN_MUTEX);

    pthread_cond_signal(wakeUpBgThread);
}

这是在后台线程中运行的函数的简短版本:

void* run_in_background(void* v) {                   
    pthread_mutex_t mutex;
    pthread_cond_t  cond;
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    //NOTE: wakeUpBgThread == cond
    save_condition_and_mutex(&cond, &mutex);

    pthread_mutex_lock(&mutex);
    {
        pthread_cond_signal(&wakeUpMainThread);

        while( run_condition ) {
            pthread_cond_wait(&cond, &mutex);

            do_smth();
        }
    }
    pthread_mutex_unlock(&mutex);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    pthread_exit(NULL);
}

所以目标是:

1. Create a thread in the main one.
2. Make the main thread sleep until the signal from that thread.
3. Make the background thread sleep until the signal from the main thread.
4. Invoke the background thread from the main one.

问题是:有时在

 pthread_cond_signal(&wakeUpMainThread);

调度程序立即切换到主线程并为后台线程触发唤醒信号。在此调度程序切换回后台线程并开始等待已经触发的信号后,它会永远休眠。

问题:有什么办法可以强制后台线程执行代码直到

pthread_cond_wait(&cond, &mutex);

【问题讨论】:

    标签: c++ c multithreading pthreads signals


    【解决方案1】:

    您在create_thread 中对pthread_mutex_lock 的调用需要在之前 pthread_create,而不是之后进行。否则你有一个竞争条件。

    【讨论】:

    • 你说得对,我应该在之前放置那个锁,但我认为这不是真正的问题,因为 MAIN_MUTEX 仅在创建新线程时使用,在其他任何地方都没有,所以它不会影响后台线程执行。
    • 您需要在调用`pthread_cond_signal(&wakeUpMainThread);`之前锁定同一个互斥体 MAIN_MUTEX
    • 谢谢。已经找到真正的问题了。这是我没有在此处发布的课程部分的僵局。
    • 这并没有改变您发布的代码也有竞争条件的事实。
    【解决方案2】:

    使用信号量?信号量信号不会丢失 - 它们只是增加计数,因此后台线程在信号量发出信号后再次运行,即使它实际上还没有开始等待它。

    Rgds, 马丁

    【讨论】:

      【解决方案3】:

      听起来你最好的选择是使用条件。有一个互斥锁和一个条件。 Main 初始化两者,获取互斥锁,创建线程,然后根据条件进入睡眠状态。 child 抢锁(在 main 等待条件之后)做工作(或者做工作然后抢锁),然后发出条件信号(你可以决定是在信号之前还是之后释放锁——重要的一点是你抓住了它)。 Main 然后唤醒并继续处理。

      pthread_cond_wait() 和朋友就是你看的。

      【讨论】:

        【解决方案4】:

        您不会在主线程上的信号之前锁定互斥锁。如果您想要可预测的行为 - 您应该在等待调用和信号调用之前锁定相同的互斥锁。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多