Подтвердить что ты не робот

Смешивание С++ 11 std:: thread и системные потоки C (т.е. Pthreads)

Я пишу многопоточную программу на С++ и хочу использовать многопоточную библиотеку 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();

после чего он будет использовать соответствующие собственные методы mutex системы для других собственных потоков системы для вызова своих функций при работе с собственной работой.

Однако я использую библиотеку С++ 11 <thread> для создания и управления всеми моими потоками. Я хочу создать рабочий поток с помощью std::thread(library_run) и вызвать библиотечные функции из других таких потоков.

Можно ли это сделать, или DS9K заставит демонов вылететь из моего носа?

4b9b3361

Ответ 1

В стандарте С++ не указано, как потоки С++ взаимодействуют с любой другой библиотекой потоков, но в целом я ожидал бы, что реализация С++ будет использовать базовую библиотеку потоковых систем, поэтому ваше использование должно быть безопасным.

Возможность использования сторонней библиотеки, использующей примитивы блокировки библиотек системной нити, является таким распространенным случаем, что ее следует ожидать, чтобы она работала (в противном случае поддержка потоковой передачи С++ была бы почти бесполезной во многих ситуациях реального мира), Как указывает Пит, все, что связано с ручками/идентификаторами потоков, может быть более сложным (но от чтения вашего вопроса не требуется).

Ответ 2

С++ 11 потоков могут иметь или не иметь функцию-член с именем native_handle(); он определяется реализацией, существует ли это. Если он существует, он возвращает объект типа native_handle_type; это реализация, определяющая, для чего может использоваться объект этого типа. Поэтому прочтите свою документацию.

Ответ 3

Это зависит от того, что на самом деле делает библиотека. Использование pthreads для мутаций и, следовательно, не должно быть проблемой. Однако, если библиотека фактически пытается управлять потоками с помощью таких функций, как pthread_join, это, вероятно, приведет к проблемам. Он может по-прежнему работать в системах, где pthread является стандартным (unix и таковым), поскольку std::thread может быть реализовано как очень тонкая оболочка вокруг pthreads, но это, очевидно, будет очень зависимым от реализации, а не тем, о работе даже для будущих версий одного и того же компилятора. Аналогичные аргументы можно использовать для использования CreateThread.

Ответ 4

Новые стандарты C и С++ (C11 и С++ 11) реализуют одну и ту же модель потоков, и их интерфейсы должны быть совместимы. Так что любая платформа предоставляет вам реализацию потоков С++ 11, также должна быть в состоянии предоставить вам то же самое в C. Если это не так, это, конечно, только временное.

Если вы находитесь на платформе с pthread как модель собственного потока (вероятно, POSIX-платформа), то поток С++ 11 почти наверняка будет построен поверх нее. Но будьте осторожны, вызывающие соглашения между этими двумя потоковыми моделями только схожи, не равны. Например, возвращаемое значение функций потока void* для pthread и int для С++ 11/C11.

Но если вы спешите и не можете дождаться, что ваш поставщик компилятора также предоставит интерфейс C11, вы можете просто реализовать мелкие интерфейсы вокруг функций С++ самостоятельно. Это не должно быть большой проблемой для этого.