これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド rrdthreads です。
プログラム:
NAME
rrdthreads - マルチスレッド プログラムで使用するために RRD ライブラリをリンクするためのプロビジョニング
SYNOPSIS
マルチスレッド プログラムで librrd を使用するには、RRD のような特別な予防措置が必要です。
元の形式のライブラリはまったくスレッドセーフではありませんでした。 この文書では、
マルチスレッド版の librrd を使用する際の要件と落とし穴
独自のプログラム。 また、ライブラリのスレッドを維持するための将来の RRD 開発のヒントも提供します。
安全。
現在、一部の RRD 操作のみがスレッドセーフな方法で実装されています。 それらはすべて次のように終わります
通常の「_r」という接尾辞。
DESCRIPTION
マルチスレッド プログラムで librrd を使用するには、次のことを行う必要があります。
・ とのリンク librrd_th ライブラリ (リンク時は「-lrrd_th」を使用してください)
· 通常の API 関数の代わりに「_r」関数を使用します。
・アットスタイルタイム指定は使用しないでください。 このような時間指定の解析は
非常にスレッドセーフではありません。
· *"_r" 以外の関数は、その関数が以下であることが明示的に文書化されている場合を除き、決して使用しないでください。
踏み出しても安全。
· すべてのスレッドは、「librrd_th」を最初に呼び出す前に「rrd_get_context()」を呼び出す必要があります(SHOULD)。
スレッド固有のデータを設定するための関数。 これは厳密には必須ではありませんが、
これは、この関数でメモリ割り当てを実行できるかどうかをテストする唯一の方法です。
そうしないと、メモリ不足の状況でプログラムが SIGSEGV で停止する可能性があります。
· ライブラリを呼び出す前に、必ず「rrd_error_clear()」を呼び出してください。 それ以外の場合は呼び出し
以前のエラーが原因で失敗する可能性があります。
注意事項 FOR DRR 貢献者
今後 RRD を開発する場合は、いくつかの注意事項に従う必要があります。
· ライブラリ コードではスレッド セーフな関数のみを使用してください。 よく使用される libc 関数の多くは、
スレッドセーフ。 以下の場合、または以下のライブラリを使用する場合は注意してください
機能:
· 「strerror()」への直接呼び出しは避けてください。代わりに「rrd_strerror()」を使用してください。
スレッドごとのエラー メッセージが表示されます。
· 「getpw*」、「getgr*」、「gethost*」関数ファミリー (およびその他の「get*」
関数) はスレッドセーフではありません: *"_r" バリアントを使用してください
· 時間関数: "asctime"、"ctime"、"gmtime"、"localtime": *"_r" バリアントを使用します。
· "strtok": "strtok_r" を使用します。
· "tmpnam": "tmpnam_r" を使用します。
· その他多数 (ドキュメントの検索)
· という名前のヘッダー ファイル rrd_is_thread_safe.h GNU で動作するものが提供されています
C プリプロセッサは、最も一般的な非スレッドセーフ関数の一部を「毒」します。
「#pragma GCC Poison」ディレクティブ。 このヘッダーを必要なソース ファイルに含めるだけです。
スレッドセーフを維持します。
· グローバル変数を導入しないでください。
本当にグローバル変数を使用する必要がある場合は、新しいフィールドを
「rrd_context」の構造と変更 rrd_error.c, rrd_thread_safe.c
rrd_non_thread_safe.c
· *"_r" では (直接的にも間接的にも) "getopt" または "getopt_long" を使用しないでください。
「getopt」はグローバル変数を使用し、次の場合にマルチスレッド アプリケーションで不正に動作します。
同時に呼び出されます。 代わりに、すべてのオプションを関数として受け取る *_r 関数を提供します。
パラメーター。 可変長引数として argc および **argv 引数を指定できます。
リスト。 例として「rrd_update_r」を参照してください。
· 「rrd_parsetime」関数は使用しないでください。
多くのグローバル変数を使用します。 意図されていない機能で使用することもできます。
一部の操作の「_r」バージョンをラップする関数のように、スレッドセーフです (例:
「rrd_create」ですが、「rrd_create_r」には含まれていません)
現在 実装済み 糸 SAFE 関数
現在、「rrd_update」、「rrd_create」、「rrd_dump」のスレッドセーフなバリアントが存在します。
「rrd_info」、「rrd_last」、および「rrd_fetch」。
onworks.net サービスを使用してオンラインで rrdthreads を使用する