C++在多线程程序中执行串行代码
Serial code execution in a multi-threaded program in C++
问题:在多线程程序中,是否可以保证代码执行一次只能在一个线程中发生?(或近似于此的东西(
具体来说:我有一个控制器 M(它是一个线程(和线程 A、B、C。我希望M能够决定谁应该被允许参选。当线程完成(最终或暂时(时,控制权将转移回 M。
原因:理想情况下,我希望 A、B 和 C 在自己的线程中执行其代码,而其他代码则不运行。这将使每个线程能够在暂停时保留其指令指针和堆栈,当控制器将控制权交还给它们时,从它们离开的地方开始。
我现在正在做什么:我已经编写了一些实际上可以做到这一点的代码 - 但我不喜欢它。
在伪 C 中:
//Controller M
//do some stuff
UnlockMutex(mutex);
do{}while(lockval==0);
LockMutex(mutex);
//continue with other stuff
//Thread A
//The controller currently has the mutex - will release it at UnlockMutex
LockMutex(mutex);
lockval=1;
//do stuff
UnlockMutex(mutex);
原因
do{}while(lockval==0);
需要的是当互斥锁解锁时,A 和 M 都会继续。此技巧可确保 A 在 M 可以再次锁定互斥锁之前不会解锁互斥锁,从而允许 A 第二次重新锁定并再次运行(它应该只运行一次(。
做虽然似乎矫枉过正,但可以完成工作。所以我的问题是,有没有更好的方法?
假设你在Windows上运行,你可以尝试查看Fibers。(参见例如 http://developer.amd.com/Pages/1031200677.aspx 或只是谷歌"Windows fibers"。
我怀疑你真的在寻找协程。
检查 Win32 中的"关键部分"。C++11使用另一个术语"lock_guard"。
如何使用 Boost 制作关键部分?
http://en.cppreference.com/w/cpp/thread/lock_guard
您的代码
do{}while(lockval==0);
会消耗您的 CPU 性能。
我假设您正在 linux 下编写 c++ 并使用 pthread API。这是代码,不是那么健壮,但是一个很好的起点。希望对您有用。使用 "g++ test_controller_thread.cpp -pthread -o test_controller_thread" 来制作二进制执行器。
// 3 threads, one for controller, the other two for worker1 and worker2.
// Only one thread can proceed at any time.
// We use one pthread_mutex_t and two pthread_cond_t to guarantee this.
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t g_controller_cond = PTHREAD_COND_INITIALIZER;
static pthread_cond_t g_worker_cond = PTHREAD_COND_INITIALIZER;
void* controller_func(void *arg) {
printf("entering the controller thread. n");
// limit the max time the controller can run
int max_run_time = 5;
int run_time = 0;
pthread_mutex_lock(&g_mutex);
while (run_time++ < max_run_time) {
printf("controller is waitting.n");
pthread_cond_wait(&g_controller_cond, &g_mutex);
printf("controller is woken up.n");
pthread_cond_signal(&g_worker_cond);
printf("signal worker to wake up.n");
}
pthread_mutex_unlock(&g_mutex);
}
void* worker_func(void *arg) {
int work_id = *(int*)arg;
printf("worker %d start.n", work_id);
pthread_mutex_lock(&g_mutex);
while (1) {
printf("worker %d is waitting for controller.n", work_id);
pthread_cond_wait(&g_worker_cond, &g_mutex);
printf("worker %d is working.n", work_id);
pthread_cond_signal(&g_controller_cond);
printf("worker %d signal the controller.n", work_id);
}
pthread_mutex_unlock(&g_mutex);
}
int main() {
pthread_t controller_thread, worker_thread_1, worker_thread_2;
int worker_id_1 = 1;
int worker_id_2 = 2;
pthread_create(&controller_thread, NULL, controller_func, NULL);
pthread_create(&worker_thread_1, NULL, worker_func, &worker_id_1);
pthread_create(&worker_thread_2, NULL, worker_func, &worker_id_2);
sleep(1);
printf("nsignal the controller to start all the process.nn");
pthread_cond_signal(&g_controller_cond);
pthread_join(controller_thread, NULL);
pthread_cancel(worker_thread_1);
pthread_cancel(worker_thread_2);
return 0;
}
- 以下代码执行哪种内存分配(动态或静态)?
- 允许多个互斥锁所有者或指定数量的并发代码执行
- 使用 execv 从C++代码执行的 Linux 脚本失败
- 由于找不到cpprest_2_10.dll,代码执行无法继续
- 在每次循环迭代时停止代码执行毫秒
- 与Java相比,为什么此C 代码执行速度如此慢
- 记录组件代码执行
- 相同的代码执行两次:性能差异
- 代码执行/CPU 速度每 2 秒减慢一次
- 函数返回本地变量,尽管变量不超出范围,没有编译器问题,并且代码执行
- 如何将字符串从C++DLL返回到MetaTrader 4代码执行生态系统?
- 当我从java代码执行C++时不显示任何输出
- C++和共享库中的代码执行点
- 递归期间代码执行中断
- 为可选的评测代码执行进行高效设计
- 我正在尝试使用 ifstream 将此 C 函数的等效代码执行到 c++ 中
- 最佳C 11测量嵌入式系统代码执行时间的方法
- 如何在iOS应用程序中锁定代码执行
- 中断代码执行
- 是否有一个工具来记录代码执行