c++ - 如何使用 win32 从多线程上下文初始化线程原语?

标签 c++ c windows multithreading

我想创建一个静态锁

void foo(){
    static CRITICAL_SECTION *lock = NULL; //this is the problem, I cannot create any primitive to do this with win32 threads
    static long isInitialized = 0;
    if (InterlockedExchange(&isInitialized, 1) == 0){ //this will ensure that lock is initialized only once
        lock = (CRITICAL_SECTION*)malloc(sizeof(CRITICAL_SECTION));
        InitializeCriticalSection(lock);
    }
    EnterCriticalSection(lock); //this might be called before initialization is done...YIKES!
    ...
    LeaveCriticalSection(lock); 
}

如何从多线程上下文中初始化锁?

糟糕的解决方案可能如下所示:

void foo(){
    static CRITICAL_SECTION *lock = NULL; //this is the problem, I cannot create any primitive to do this with win32 threads
    static long isInitialized = 0;
    static volatile long isInitializeDone = 0;
    if (InterlockedExchange(&isInitialized, 1) == 0){ //this will ensure that lock is initialized only once
        lock = (CRITICAL_SECTION*)malloc(sizeof(CRITICAL_SECTION));
        InitializeCriticalSection(lock);
        isInitializeDone = 1;
    } else {
        while (isInitializeDone == 0){

        }
    }
    EnterCriticalSection(lock); //this might be called before initialization is done...YIKES!
    ...
    LeaveCriticalSection(lock); 
}

但是有更好的解决方案吗?

最佳答案

如果这是 C++,您可以调用一个函数来初始化该临界区:

static CRITICAL_SECTION *lock = get_critical_section();

喜欢

CRITICAL_SECTION* get_critical_section()
{
    CRITICAL_SECTION *lock = NULL;
    InitializeCriticalSection(&lock);
    return lock;
}

C++ 规定只有一个线程会初始化那个东西,所有其他线程都会等待它:

[stmt.dcl]

如果控制进入 在初始化变量时并发声明,并发执行等待 初始化完成。

编辑:我不知道从什么时候开始标准中的文本是这样的,但我很确定这是所有实现所做的。

关于c++ - 如何使用 win32 从多线程上下文初始化线程原语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21131645/

相关文章:

c++ - 从 C++ 代码创建静态库并与 iPhone SDK 链接

c++ - 如何将 tanh 函数作为参数传递给另一个函数?

c++ - 是否有一个对称的设计模式让成员类可以有指向彼此的指针?

c++ - 可变参数列表 C++ 的代码优化问题

c - Printf、scanf 和 For 循环问题

Python input() 在 plink 之后无响应

c - 如何让这个程序在 C 中读取两位数和三位数?

检查之前由应用程序启动的进程是否始终返回事件进程

python - 如何使用 setuptools 为 windows 命令行安装 python 脚本?

c++ GetCurrentThemeName 为经典 Windows 主题返回空值