14

我正在编写一个多线程 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();

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

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

这样做安全吗,还是 DS9K 会让恶魔从我的鼻子里飞出来?

4

5 回答 5

7

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

于 2012-09-18T19:16:36.587 回答
4

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

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

于 2012-09-18T20:15:08.683 回答
2

这取决于图书馆实际在做什么。使用pthreads静音等应该不是问题。但是,如果库实际上尝试使用诸如 之类的函数来管理线程pthread_join,则可能会导致问题。它可能仍然适用于pthread标准(unix等)的系统,因为std::thread可以作为一个非常薄的包装器来实现pthreads,但这显然是非常依赖于实现的,即使对于相同的未来版本,我也不指望工作编译器。可以为CreateThread.

于 2012-09-18T19:20:08.163 回答
1

新的 C 和 C++ 标准(C11 和 C++11)都实现了相同的线程模型,并且它们的接口应该是兼容的。因此,无论平台为您提供 C++11 线程的实现,都应该能够在 C 中为您提供相同的实现。如果不能,那肯定只是暂时的。

如果您在将 pthread 作为本机线程模型的平台(可能是 POSIX 平台)上,那么 C++11 线程几乎肯定是在它之上构建的。但请注意,这两种线程模型之间的调用约定只是相似,而不是相等。例如,线程函数的返回值void*用于 pthread 和intC++11/C11。

但是,如果您赶时间,并且迫不及待地希望您的编译器供应商也提供 C11 接口,您可以自己围绕 C++ 函数实现浅接口。这样做应该没什么大不了的。

于 2012-09-18T21:48:44.400 回答
0

这样做安全吗,还是 DS9K 会让恶魔从我的鼻子里飞出来?

我不会尝试将它用于关键任务软件。在 std::thread 上尝试 WinApi 调用后FreeLibraryAndExitThread,它退出了线程但没有释放 dll。(它与 CreateThread 一起工作)

于 2019-03-21T11:19:24.010 回答