首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pthreads -强制线程运行

pthreads -强制线程运行
EN

Stack Overflow用户
提问于 2011-06-15 03:14:25
回答 4查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
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);
}

所以我们的目标是:

代码语言:javascript
复制
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.

问题是:有时在

代码语言:javascript
复制
 pthread_cond_signal(&wakeUpMainThread);

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

问:有没有办法强制后台线程执行代码,直到

代码语言:javascript
复制
pthread_cond_wait(&cond, &mutex);
EN

回答 4

Stack Overflow用户

发布于 2011-06-15 03:38:35

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

票数 2
EN

Stack Overflow用户

发布于 2011-06-15 03:51:20

使用信号量?信号量信号不会丢失-它们只是增加计数&所以后台线程将在信号量发出信号后再次运行,即使它实际上还没有找到时间等待它。

Rgds,Martin

票数 1
EN

Stack Overflow用户

发布于 2011-06-15 03:20:54

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6348783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档