14

I am writing a multithreaded C++ program and wish to use a multithreaded C library.
This library expects me to use the native system methods to create it some worker threads and pass control to its run() function using code such as this:

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();

after which it will use the relevant native system mutex methods to other native system threads to call its functions while getting on with is own work.

However, I am using the C++11 <thread> library to create and manage all my threads. I wish to create the worker thread(s) with std::thread(library_run) and call the library functions from other such threads.

Is it safe to do this, or will the DS9K cause demons to fly out of my nose?

4

5 に答える 5

7

native_handle()C++11 スレッドには、 ;という名前のメンバー関数がある場合とない場合があります。これが存在するかどうかは実装定義です。存在する場合は、タイプのオブジェクトを返します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スレッドはほぼ確実にその上に構築されます。ただし、これら2つのスレッドモデル間の呼び出し規約は類似しているだけで、等しくないことに注意してください。たとえば、スレッド関数の戻り値はvoid*、pthreadおよびintC ++ 11/C11の場合です。

しかし、急いでいて、コンパイラベンダーがC11インターフェイスも提供するのを待ちきれない場合は、C++関数の周りに浅いインターフェイスを自分で実装することができます。これは大したことではないはずです。

于 2012-09-18T21:48:44.400 に答える