0

在MinGW环境下必须使用pthread库编译多线程程序吗?我在TrueStudio中看到集成MinGW中的头文件声明了_beginthreadex函数。但程序运行出现异常。我不知道我是否使用了 _ beginthreadex 函数。

//process.h
/* Thread initiation and termination functions.
 *
 * NOTE: Apparently _endthread() calls CloseHandle() on the handle of the
 * thread, creating a potential for race conditions, if you are not careful.
 * Basically, you MUST ensure that NOTHING attempts to do ANYTHING with the
 * thread handle after the thread calls _endthread(), or returns from the
 * thread function.
 *
 * NOTE: No old names for these functions.  Use the underscore.
 */
_CRTIMP __cdecl __MINGW_NOTHROW
unsigned long _beginthread (void (*)(void *), unsigned, void *);

_CRTIMP __cdecl __MINGW_NOTHROW  void _endthread (void);

#ifdef __MSVCRT__
_CRTIMP __cdecl __MINGW_NOTHROW  unsigned long _beginthreadex
(void *, unsigned, unsigned (__stdcall *) (void *), void *, unsigned, unsigned *);

_CRTIMP __cdecl __MINGW_NOTHROW  void _endthreadex (unsigned);
#endif

更新:以上信息是否表明MSVC编译器需要支持_beginthreadex函数,而不是_beginthread函数?

4

2 回答 2

0

不,不必使用pthreads。您可以直接使用 Win32 API。

        hThreadArray[i] = CreateThread( 
            NULL,                   // default security attributes
            0,                      // use default stack size  
            MyThreadFunction,       // thread function name
            pDataArray[i],          // argument to thread function 
            0,                      // use default creation flags 
            &dwThreadIdArray[i]);   // returns the thread identifier 

如果你担心便携性,你也可以通过libuv.

https://docs.microsoft.com/en-us/windows/win32/procthread/creating-threads

http://libuv.org/

于 2021-06-29T06:31:42.330 回答
0

您应该使用 MinGW-w64 而不是 MinGW,它得到更多维护和更新,并支持 Windows 32 位和 64 位。

至于线程,任何 MinGW(-w64) 都将提供 Windows 线程 API,但任何带有 POSIX 线程支持的 MinGW-w64 构建(如来自https://winlibs.com/的独立构建)也将允许您在视窗。

如果由于某种原因您坚持使用经典的 MinGW,您还可以查看https://sourceforge.net/projects/pthreads4w/以仍然能够使用 pthreads。

于 2021-06-29T08:21:37.607 回答