繁体   English   中英

pthreads - 强制线程运行

[英]pthreads - force thread to run

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

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);
}

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

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);

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

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

Rgds,马丁

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM