c++ - 使用事件同步线程

标签 c++ c multithreading winapi

这是我第一次使用事件同步线程。我的代码工作正常。但据我所知,它看起来不错,但有明显的错误,当我在更大的项目中使用这个概念时,很难找到。

所以我只想问一下这种使用事件同步线程的方式是否适合您?

我们的想法是我们有只能从主线程调用的 GetSymbol 函数。服务器线程需要向主线程询问此函数的结果。

#include <windows.h>
#include <process.h>
#include <stdio.h>

HANDLE symbol_need, symbol_ready, end;

int symbol_container;

int GetSymbol()
{
    // Only main thread can use this function.
    static int i = 0;
    return ++i;
}

void Server(void* p)
{
    printf("Ask for first symbol.\n");
    SetEvent(symbol_need);

    DWORD wait_result;

    wait_result = WaitForSingleObject(symbol_ready, INFINITE);
    if(WAIT_OBJECT_0 == wait_result)
    {
        ResetEvent(symbol_ready);
        printf("First symbol: %i\n", symbol_container);
    } else {
        printf("Something went wrong.\n");
    }

    printf("Ask for second symbol.\n");
    SetEvent(symbol_need);

    wait_result = WaitForSingleObject(symbol_ready, INFINITE);
    if(WAIT_OBJECT_0 == wait_result)
    {
        ResetEvent(symbol_ready);
        printf("Second symbol: %i\n", symbol_container);
    } else {
        printf("Something went wrong.\n");
    }

    printf("OK, finish it.");
    SetEvent(end);
}


int main(int argc, char* argv[])
{
    symbol_need = CreateEvent( NULL, FALSE, FALSE, NULL );
    symbol_ready = CreateEvent( NULL, FALSE, FALSE, NULL );
    end = CreateEvent( NULL, FALSE, FALSE, NULL );

    _beginthread(Server, 0, NULL);

    DWORD wait_result;

    while(1)
    {
        wait_result = WaitForSingleObject(symbol_need, 100);
        if(WAIT_OBJECT_0 == wait_result)
        {
            ResetEvent(symbol_need);
            symbol_container = GetSymbol();
            SetEvent(symbol_ready);
        }
        wait_result = WaitForSingleObject(end, 100);
        if(WAIT_OBJECT_0 == wait_result)
        {
            break;
        }
    }
    return 0;
} 

最佳答案

是的,这段代码是正确的。

此示例有助于了解事件的工作原理。但是,编写生产代码时无需重新发明轮子。例如,您描述的交互可以使用并发数据结构(如英特尔 TBB 库中的数据结构)进行优雅建模,例如concurrent_bounded_queue .

关于c++ - 使用事件同步线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575089/

相关文章:

c++ - 我是否正在使用OpenMP干扰其他程序?

c++ - 我可以简化以下模板吗?

c++ - 在 if 语句中声明类变量

c++ - C++ 编译器是否会独立决定内联 lambda 函数及其调用者?

c - 如何设置通过参数传递给函数的 int 值并将其分配给全局,以便我可以在函数外部使用?

c - printf() 和 scanf() 函数何时静态或动态链接到应用程序?

c++ - 每当 WebKit 尝试加载 HTML 时,Qt 应用程序就会崩溃

c - 当我在 source.h 中只定义了每个指定变量一次时,为什么会出现 "multiple definition of"错误?

java - 如何在 RxJava2 中并行执行消费者?

c++ - QVector 项目是否共享相同的缓存行?