Linux で C ライブラリを作成しています。これにはいくつかの関数があり、いくつかのグローバル データを一緒に操作します。これらの関数をスレッド セーフにするためには、コード内の適切なポイントでミューテックスを使用する必要があります。
Linux では、アプリケーションで pthread を使用するには、適切なライブラリ-lpthreadにリンクする必要があります。私のライブラリがコンパイルされたら、そのライブラリのユーザーがアプリケーションで pthread を使用することを決定した場合と使用しない場合の両方で機能させたいと考えています。
開発者がアプリケーションでスレッドを使用しない場合、それらは pthread に対してリンクしません。したがって、コンパイルされたライブラリでそれを必要としないようにしたいと思います。さらに、単一のスレッド化されたアプリケーションでミューテックスを使用すると、不必要なオーバーヘッドが使用されます (言うまでもなくばかげています)。
特定のシンボルがリンクされている場合にのみ特定のコードブロックが実行されるコードを (必要に応じて GCC 拡張を使用して) 記述する方法はありますか? dlopen()とその仲間を使用できることは承知していますが、それ自体で回避しようとしていることがいくつか必要になります。いくつかの標準関数が同じボートにあり、ミューテックスをスレッドセーフにする必要があるため (そしてそれらはそうです)、pthreads とリンクされていなくても機能するため、私が探しているものが存在する必要があると思います。
この時点で、66 行目と 67 行目の FreeBSD の popen() 関数が移植性のないチェック ( isthreaded ) を使用して、スレッドが使用されているかどうか、およびミューテックスを使用するかどうかを判断していることに気付きました。そのようなものが何らかの方法で標準化されているとは思えません。しかし、シンボルが認識されない場合、そのようなコードはコンパイルおよびリンクできません。Linux では、pthread がリンクされていない場合、mutex シンボルは存在しません。
要約すると、Linux では、アプリケーション開発者が特にどこかでスレッドを使用したい場合を除き、スレッドがいつ使用されるかを認識し、必要に応じてミューテックスを使用し、pthread に対するリンクを必要としないライブラリを作成するにはどうすればよいでしょうか?