混合C++ 11 std :: thread和C系统线程(即pthreads)

Lex*_*x R 14 c c++ multithreading c++11

我正在编写一个多线程C++程序,并希望使用多线程C库.
这个库希望我使用本机系统方法创建一些工作线程,并使用如下代码将控制传递给它的run()函数:

void system_specific_thread_init();
#ifdef _WIN32
    DWORD WINAPI system_specific_thread_run( LPVOID unused )
    {
        library_run();
        return 0;
    }

    void system_specific_thread_init()
    {
        Createthread(NULL, 0, system_specific_thread_run, NULL, 0, NULL);
    }
#else
    void* system_specific_thread_run(void *unused)
    {
        library_run();
        return NULL;
    }

    void system_specific_thread_init()
    {
        pthread_t id;
        pthread_create(&id, NULL, system_specific_thread_run, NULL);
    }
#endif
system_specific_thread_init();
Run Code Online (Sandbox Code Playgroud)

之后,它将使用相关的本机系统互斥方法到其他本机系统线程来调用其函数,同时继续使用是自己的工作.

但是,我使用C++ 11 <thread>库来创建和管理我的所有线程.我希望创建工作线程,std::thread(library_run)并从其他此类线程调用库函数.

这样做是否安全,或者DS9K是否会导致恶魔飞出我的鼻子?

Pet*_*ker 7

C++ 11线程可能有也可能没有名为的成员函数native_handle(); 它是实现 - 定义是否存在.如果存在,则返回类型的对象native_handle_type; 它的实现定义了这种类型的对象可以用于什么.所以请阅读您的文档.


cme*_*erw 5

C++ 标准没有指定 C++ 线程如何与任何其他线程库交互,但一般来说,我希望 C++ 实现使用底层系统线程库,因此您的使用应该是安全的。

能够使用使用系统线程库锁定原语的第三方库是一种常见的用例,因此应该可以正常工作(否则 C++ 线程支持在许多实际情况下几乎毫无用处)。正如 Pete 指出的那样,任何涉及线程句柄/ID 的内容都可能更加棘手(但阅读您的问题时不应该需要这样做)。