【问题标题】:Run multiple threads when other threads not executing?当其他线程不执行时运行多个线程?
【发布时间】:2016-04-30 23:58:14
【问题描述】:

有没有办法让它在其他线程不锁定其他功能时让 n 个线程运行某个功能?

我想达到这样的目标:

pthread_t threadID[10];
pthread_mutex_t blocking;
pthread_mutex_init(&blocking, NULL);
pthread_cond_t go;
pthread_cond_init(&go, NULL);

void * function1() {
    pthread_mutex_lock(&blocking); // Only one thread at a time!
    // Do some work
    pthread_cond_broadcast(&go);
    pthread_mutex_unlock(&blocking);
}

void * function2() {
    pthread_cond_wait(&go, NULL); // Imagine 5 threads waiting here.
    // Does some work too!
}

我想要的基本上是 n 个线程运行 function2,而 function1 中没有运行线程。

我不希望锁定 function2,因为线程可能会毫无问题地同时执行它,所以我知道 pthread_cond_wait(&go, NULL) 将不起作用(即使 NULL 参数也有点傻)。此外,广播将向所有等待线程发出信号,但只有其中一个线程会到达关键代码部分。我的目标是用信号解锁所有线程,并允许所有这些线程执行代码。

我知道有一些方法可以在不进入线程锁定机制的情况下执行此操作(例如在 function1 中修改变量,并且 function2 必须在允许线程前进之前检查其值),但我想知道是否有办法互斥锁和条件变量,而不是信号量。

【问题讨论】:

    标签: c multithreading concurrency


    【解决方案1】:

    是的,这很容易做到。使用互斥锁保护共享状态,需要等待共享状态改变时使用条件变量,使用普通整数变量跟踪共享状态。

    当一个线程进入一个区域时,它应该:

    1. 获取互斥体。
    2. 检查是否允许运行该区域。虽然不允许,但在释放互斥锁时阻止条件变量。
    3. 增加该区域中的线程数。
    4. 释放互斥锁。

    当一个线程连接一个区域时,它应该:

    1. 获取互斥体。
    2. 减少该区域中的线程数。
    3. 如果计数的变化可能允许线程取得进展,请广播条件变量。
    4. 释放互斥锁。

    就这么简单。

    【讨论】:

    • 我不确定我是否 100% 关注你。如果我把function2封装在一个互斥体中,即使我将条件变量广播给所有等待的线程,它们也会进入竞争条件,只有一个能够执行function2。我的目标是允许 function2 中的所有线程并发,所以我看不出保持该区域中线程数量的计数有什么帮助。或者我只是在你的解释中遗漏了一些东西!
    • 你在说什么比赛条件?什么会阻止其他人执行功能 2?你认为他们会在哪里被阻止?
    • 另外,请注意该函数并不是真正“封装在互斥体中”。我只是执行上面的两种算法,一种是在它开始处理之前,一种是在它完成处理之后。两种算法在完成后都会释放互斥锁,因此在处理过程中不会保留互斥锁。
    • 好的,我明白你的意思。让函数的主要工作不受保护,没有互斥体,只需在函数的开头和结尾保持线程数和线程数,用互斥体保护这些变量。我觉得这会带走一点“并发性”:每个线程进入函数,然后一个一个地被计数,然后它们按照完成计数的顺序完成工作。不过这个解决方案对我有用,所以谢谢!
    • @VDG 如果函数花费的时间太短以至于进入和退出函数的同步成本很重要,那么整个设计是错误的,你应该在函数内部循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多