необходимо ли использовать библиотеку pthread для компиляции многопоточных программ в среде MinGW?

#multithreading #class #mingw #pthreads-win32

Вопрос:

необходимо ли использовать библиотеку pthread для компиляции многопоточных программ в среде MinGW? Я видел, что в заголовочном файле объявлена функция _ beginthreadex в интегрированном MinGW, в TrueSTUDIO. но в работе программы было исключение. Я не знаю, использовал ли я функцию _ 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
 

Обновить:
Указывает ли приведенная выше информация на то, что функция _ beginthreadex должна поддерживаться компилятором MSVC, но не функцией _ beginthread?

Ответ №1:

Нет, не нужно использовать 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 
            amp;dwThreadIdArray[i]);   // returns the thread identifier 
 

И если вас беспокоит мобильность, вы также можете пройти через libuv это .

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

http://libuv.org/

Ответ №2:

Вместо MinGW вам следует использовать MinGW-w64, который гораздо более поддерживается и обновляется и поддерживает как 32-разрядную, так и 64-разрядную версию Windows.

Что касается потоковой передачи, любой MinGW(-w64) предоставит API потоков Windows, но любая сборка MinGW-w64 с поддержкой потоков POSIX (например, автономные сборки из https://winlibs.com/) также позволит вам использовать pthreads в Windows.

Если по какой-то причине вы застряли с классическим MinGW, вы также можете взглянуть на https://sourceforge.net/projects/pthreads4w/ чтобы по-прежнему иметь возможность использовать pthreads.