同期およびアトミック組み込み関数

プロトタイプ 説明
unsigned int __check_lock_mp (const int* addr, int old_value, int new_value); Check Lock on Multiprocessor Systems

条件付きで、シングル・ワード変数をアトミック更新します。addr は、シングル・ワード変数のアドレスを指定します。old_value は、シングル・ワード変数の値に照らし合わせて検査される元の値を指定します。 new_value は、シングル・ワード変数に条件付きで割り当てられる新規の値を指定します。 ワード変数は、フルワード境界で位置合わせしておかなければなりません。

戻り値:

  1. false (偽) の戻り値は、シングル・ワード変数が古い値と同じで、新しい値に設定されたことを示す。
  2. true (真) の戻り値は、シングル・ワード変数が古い値と同じでなく、未変更のままであることを示す。
unsigned int __check_lockd_mp (const long long int* addr, long long int old_value, long long int new_value); Check Lock Doubleword on Multiprocessor Systems

条件付きで、ダブルワード変数をアトミック更新します。addr は、ダブルワード変数のアドレスを指定します。old_value は、ダブルワード変数の値に照らし合わせて検査される元の値を指定します。 new_value は、ダブルワード変数に条件付きで割り当てられる新規の値を指定します。 ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。

戻り値:

  1. false (偽) の戻り値は、ダブルワード変数が古い値と同じで、新規の値に設定されたことを示す。
  2. true (真) の戻り値は、ダブルワード変数が古い値と同じでなく、未変更のままであることを示す。

64 ビット・モードでのみサポートされます。

unsigned int __check_lock_up (const int* addr, int old_value, int new_value); Check Lock on Uniprocessor Systems

条件付きで、シングル・ワード変数をアトミック更新します。addr は、シングル・ワード変数のアドレスを指定します。old_value は、シングル・ワード変数の値に照らし合わせて検査される元の値を指定します。 new_value は、シングル・ワード変数に条件付きで割り当てられる新規の値を指定します。 ワード変数は、フルワード境界で位置合わせしておかなければなりません。

戻り値:

  • false (偽) の戻り値は、シングル・ワード変数が古い値と同じで、新規の値に設定されたことを示す。
  • true (真) の戻り値は、シングル・ワード変数が古い値と同じでなく、未変更のままであることを示す。
unsigned int __check_lockd_up (const long long int* addr, long long int old_value, int long long new_value); Check Lock Doubleword on Uniprocessor systems

条件付きで、ダブルワード変数をアトミック更新します。addr は、ダブルワード変数のアドレスを指定します。old_value は、ダブルワード変数の値に照らし合わせて検査される元の値を指定します。 new_value は、ダブルワード変数に条件付きで割り当てられる新規の値を指定します。 ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。

戻り値:

  • false (偽) の戻り値は、ダブルワード変数が古い値と同じで、新規の値に設定されたことを示す。
  • true (真) の戻り値は、ダブルワード変数が古い値と同じでなく、未変更のままであることを示す。

64 ビット・モードでのみサポートされます。

void __clear_lock_mp (const int* addr, int value); Clear Lock on Multiprocessor Systems

アドレス addr にあるシングル・ワード変数に、value をアトミック保管します。 ワード変数は、フルワード境界で位置合わせしておかなければなりません。

void __clear_lockd_mp (const long long int* addr, long long int value); Clear Lock Doubleword on Multiprocessor Systems

アドレス addr にあるダブルワード変数に、value をアトミック保管します。 ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。

64 ビット・モードでのみサポートされます。

void __clear_lock_up (const int* addr, int value); Clear Lock on Uniprocessor Systems

アドレス addr にあるシングル・ワード変数に、value をアトミック保管します。 ワード変数は、フルワード境界で位置合わせしておかなければなりません。

void __clear_lockd_up (const long long int* addr, long long int value); Clear Lock Doubleword on Uniprocessor Systems

アドレス addr にあるダブルワード変数に、value をアトミック保管します。 ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。

64 ビット・モードでのみサポートされます。

int __compare_and_swap(volatile int* addr, int* old_val_addr, int new_val); シングル・ワード変数の内容を、保管されている古い値と比較するアトミック演算を実行します。 値が等しい場合、新規値がシングル・ワード変数に保管されて、1 が戻されます。等しくない場合は、シングル・ワード変数は更新されず、0 が戻されます。いずれの場合も、addr によって指定されたメモリー・ロケーションが old_val_addr によって指定されたメモリー・ロケーションにコピーされます。

__compare_and_swap 関数は、シングル・ワード値が最後の読み取り以降変更されていないときにのみ更新を必要とする場合に役立ちます。入力パラメーター addr として取られるメモリー・ロケーションは 4 バイトの位置合わせでなければなりません。 __compare_and_swap がロック・プリミティブとして使用される場合は、__isync 組み込み関数をクリティカル・セクションの最初に挿入してください。

int __compare_and_swaplp(volatile long* addr, long* old_val_addr, long new_val); ダブルワード変数の内容を、保管されている古い値と比較するアトミック演算を実行します。 値が等しい場合、新規値がダブルワード変数に保管されて、1 が戻されます。等しくない場合は、ダブルワード変数は更新されず、0 が戻されます。いずれの場合も、addr によって指定されたメモリー・ロケーションが old_val_addr によって指定されたメモリー・ロケーションにコピーされます。 入力パラメーター addr として取られるメモリー・ロケーションは 8 バイトの位置合わせでなければなりません。

この関数は、ダブルワードが最後の読み取り以降変更されていないときにのみ更新を必要とする場合に役立ちます。__compare_and_swaplp がロック・プリミティブとして使用される場合は、__isync 組み込み関数をクリティカル・セクションの最初に挿入してください。

64 ビット・モードでのみサポートされます。

void __eieio(void); Enforce In-order Execution of Input/Output

主メモリーで __eioeio への呼び出しより前のすべての入出力ストレージ・アクセス命令が完了してからでないと、その関数呼び出しの後の入出力ストレージ・アクセス命令を実行できないことを保証します。

この組み込み関数は、ロード/保管アクセスの実行順序が重大なところで共用データ命令を管理するのに有用です。 この関数は、他の同期命令と異なり、パフォーマンスを犠牲にすることなく、I/O 保管の制御に必要な機能を提供することができます。

int __fetch_and_add(volatile int* addr, int val); 単一アトミック演算で addr によって指定されたシングル・ワードを、val によって指定された量だけ増分します。

戻り値はこのメモリー・ロケーションの元のコンテンツと等しくなります。addr によって指定されたアドレスは 4 バイトで位置合わせされている必要があります。

この演算は、カウンター変数がいくつかのスレッドまたはプロセスの間で共用されている場合に役立ちます。

long __fetch_and_addlp(volatile long* addr, long val); 単一アトミック演算で addr によって指定されたダブルワードを、val によって指定された量だけ増分します。 戻り値はこのメモリー・ロケーションの元のコンテンツと等しくなります。addr によって指定されたアドレスは 8 バイトで位置合わせされている必要があります。

この演算は、カウンター変数がいくつかのスレッドまたはプロセスの間で共用されている場合に役立ちます。

64 ビット・モードでのみサポートされます。

unsigned int __fetch_and_and(volatile unsigned int* addr, unsigned int val); 単一アトミック演算で、addr によって指定されたシングル・ワードのビットを、その値を入力 val パラメーターと AND 演算することにより消去します。 戻り値はこのメモリー・ロケーションの元のコンテンツと等しくなります。addr によって指定されたアドレスは 4 バイトで位置合わせされている必要があります。

この演算は、ビット・フラグを含む変数がいくつかのスレッドまたはプロセスの間で共用されている場合に役立ちます。

unsigned long __fetch_and_andlp(volatile unsigned long* addr, unsigned long val); 単一アトミック演算で、addr によって指定されたダブルワードのビットを、その値を入力 val パラメーターと AND 演算することにより消去します。 戻り値はこのメモリー・ロケーションの元のコンテンツと等しくなります。addr によって指定されたアドレスは 8 バイトで位置合わせされている必要があります。

この演算は、ビット・フラグを含む変数がいくつかのスレッドまたはプロセスの間で共用されている場合に役立ちます。

64 ビット・モードでのみサポートされます。

unsigned int __fetch_and_or(volatile unsigned int* addr, unsigned intval); 単一アトミック演算で、addr によって指定されたシングル・ワードのビットを、その値を入力 val パラメーターと OR 演算することにより設定します。 戻り値はこのメモリー・ロケーションの元のコンテンツと等しくなります。addr によって指定されたアドレスは 4 バイトで位置合わせされている必要があります。

この演算は、ビット・フラグを含む変数がいくつかのスレッドまたはプロセスの間で共用されている場合に役立ちます。

unsigned long __fetch_and_orlp(volatile unsigned long* addr, unsigned long val; 単一アトミック演算で、addr によって指定されたダブルワードのビットを、その値を入力 val パラメーターと OR 演算することにより設定します。 戻り値はこのメモリー・ロケーションの元のコンテンツと等しくなります。addr によって指定されたアドレスは 8 バイトで位置合わせされている必要があります。

この演算は、ビット・フラグを含む変数がいくつかのスレッドまたはプロセスの間で共用されている場合に役立ちます。

64 ビット・モードでのみサポートされます。

unsigned int __fetch_and_swap(volatile unsigned int* addr, unsigned intval); 単一アトミック演算で、addr によって指定されたシングル・ワードを値または入力 val パラメーターに設定し、メモリー・ロケーションのオリジナル・コンテンツを戻します。addr によって指定されるアドレスは 4 バイトで位置合わせでなければなりません。

この演算は、変数が幾つかのスレッドまたはプロセス間で共用されており、1 つのスレッドが元々そのロケーションに保管されていた値を失うことなく、変数の値を更新する必要があるときに役立ちます。

unsigned long __fetch_and_swaplp(volatile unsigned long* addr, unsigned long val); 単一アトミック演算で、addr によって指定されたダブルワードを値または入力 val パラメーターに設定し、メモリー・ロケーションのオリジナル・コンテンツを戻します。addr によって指定されたアドレスは 8 バイトで位置合わせされている必要があります。

この演算は、変数が幾つかのスレッドまたはプロセス間で共用されており、1 つのスレッドが元々そのロケーションに保管されていた値を失うことなく、変数の値を更新する必要があるときに役立ちます。

64 ビット・モードでのみサポートされます。

void __iospace_eieio(void); __eieio 組み込み関数 (上記) の代替名。
void __iospace_lwsync(void); __lwsync 組み込み関数 (下記) の代替名。
void __iospace_sync(void);) __sync 組み込み関数 (下記) の代替名。
void __isync(void); 前の命令がすべて完了するまで待ってから、プリフェッチされた命令をすべて破棄し、後続の命令が前の命令によって確立されたコンテキストでフェッチ (または再フェッチ) され、実行されるようにします。
long __ldarx(volatile long* addr); Load Doubleword and Reserve Indexed

addr によって指定されたメモリー・ロケーションから値をロードして、その結果を戻します。 addr は 8 バイトで位置合わせされている必要があります。

後続の __stdcx 組み込み関数と共に使用して、指定されたメモリー・ロケーションで read-modify-write をインプリメントすることができます。この 2 つの組み込み関数は一緒に機能し、 保管が正常に行われた場合、__ldarx 関数が実行されてから __stdcx 関数が完了するまでの間に、他のプロセッサーまたはメカニズムがターゲットのダブルワードを変更できないことを保証します。これは、__fence 組み込み関数を __ldarx 組み込み関数の前後に挿入したのと同じ効果を持ち、周辺のコードをコンパイラーが最適化するのを禁じることができます (__fence 組み込み関数の説明については、各種組み込み関数を参照してください)。

64 ビット・モードでのみサポートされます。

int __lwarx(volatile int* addr); Load Word and Reserve Indexed

addr によって指定されたメモリー・ロケーションから値をロードして、その結果を戻します。64 ビット・モードでは、コンパイラーは符号拡張された結果を戻します。addr は 4 バイトで位置合わせされている必要があります。

後続の __stwcx 組み込み関数と共に使用して、指定されたメモリー・ロケーションで read-modify-write をインプリメントすることができます。この 2 つの組み込み関数は一緒に機能し、 保管が正常に行われた場合、__lwarx 関数が実行されてから __stwcx 関数が完了するまでの間に、他のプロセッサーまたはメカニズムがターゲットのダブルワードを変更できないことを保証します。これは、__fence 組み込み関数を __lwarx 組み込み関数の前後に挿入したのと同じ効果を持ち、周辺のコードをコンパイラーが最適化するのを禁じることができます。

void __lwsync(void); __lwsync への呼び出しの前のすべての保管命令が完了してからでないと、その関数を実行したプロセッサー上で新規命令を実行できないことを保証します。__lwsync は各プロセッサーからの確認を待たないため、こうすると、パフォーマンス上の影響を最小限にして複数のプロセッサー間の同期化を実行することができます。
int __stdcx(volatile long* addr, long val); Store Doubleword Conditional Indexed

val によって指定された値を addr によって指定されたメモリー・ロケーションに保管し、指定されたメモリー・ロケーションの更新が成功すると 1 を戻し、失敗すると 0 を戻します。addr は 8 バイトで位置合わせされている必要があります。

先行する __ldarx 組み込み関数と共に使用して、指定されたメモリー・ロケーションで read-modify-write をインプリメントすることができます。 この 2 つの組み込み関数は一緒に機能し、 保管が正常に行われた場合、__ldarx 関数が実行されてから __stdcx 関数が完了するまでの間に、他のプロセッサーまたはメカニズムがターゲットのダブルワードを変更できないことを保証します。これは、__fence 組み込み関数を __stdcx 組み込み関数の前後に挿入したのと同じ効果を持ち、周辺のコードをコンパイラーが最適化するのを禁じることができます。

64 ビット・モードでのみサポートされます。

int __stwcx(volatile int* addr, int val); Store Word Conditional Indexed

val によって指定された値を addr によって指定されたメモリー・ロケーションに保管し、指定されたメモリー・ロケーションの更新が成功すると 1 を戻し、失敗すると 0 を戻します。addr は 4 バイトで位置合わせされている必要があります。

先行する __lwarx 組み込み関数と共に使用して、指定されたメモリー・ロケーションで read-modify-write をインプリメントすることができます。 この 2 つの組み込み関数は一緒に機能し、 保管が正常に行われた場合、__lwarx 関数が実行されてから __stwcx 関数が完了するまでの間に、他のプロセッサーまたはメカニズムがターゲットのダブルワードを変更できないことを保証します。これは、__fence 組み込み関数を __stwcx 組み込み関数の前後に挿入したのと同じ効果を持ち、周辺のコードをコンパイラーが最適化するのを禁じることができます。

void __sync(void);

関数呼び出し __sync より前のすべての命令が完了してからでないと、その関数呼び出しの後の命令を実行できないことを保証します。