c++ - pthreads - 强制线程运行

标签 c++ c multithreading pthreads signals

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

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

最佳答案

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

关于c++ - pthreads - 强制线程运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6348783/

相关文章:

我可以在没有 atomic_load 的情况下读取原子变量吗?

Java httpURLConnection 线程化

java - 工作线程发送到 sleep 后,CompletableFuture没有响应

java - 如何中断System.in的读取?

c++ - WinSock 非阻塞 I/O

C++ 从字符串调用方法

c - 简单链表构建代码说明

c - malloc 可以分配的最大大小?

c# - 如何从 C++ 调用托管 (C#) 函数?

c++ - wxWidgets 从文件加载图像