31

pthreadを使用したポータブルスレッドに似たアトミック変数操作のための(POSIX-)ポータブルな方法はCにありますか?

アトミック操作は、アトミックに実行される「インクリメントアンドゲット」のような操作です。つまり、コンテキストスイッチが操作に干渉することはありません。Linuxカーネルスペースでは、atomic_tタイプにする必要があり、Javaでは、java.util.concurrent.atomicパッケージがあります。

Linuxでは、atomic.hファイルはアトミック操作を提供しますが、インクルードはプラットフォームに依存します。たとえば#include <asm-x86_64/atomic.h>、MacOSXでは同様の方法で使用できません。

4

7 に答える 7

10

OS Xを要求したので:

(そして、このスレッドでクロスプラットフォームが発生したためです。)

OS Xには、 OSAtomicAdd32()およびその仲間の関数があります。それらは「/usr/include/libkern/OSAtomic.h」で宣言されています。スレッドプログラミングガイドの「アトミック操作の使用」セクションを参照してください。

また、Windowsの場合、InterlockedIncrement()とその仲間がいます(MSDNを参照)。

gccの組み込みの__sync_fetch_and_add()とその仲間(上記でリンクされています)と一緒に、すべてのメインデスクトッププラットフォームに何かを用意する必要があります。

私はまだ自分で使用していませんが、数日中に使用する可能性があることに注意してください。

于 2010-09-07T15:36:54.700 に答える
4

いいえ、POSIX はポータブル ロックフリー/アトミック操作を指定ていません。そのため、pthreads があります。

非標準の方法を使用するか、移植性のために ptrheads を使用する必要があります。

于 2009-07-15T08:31:56.400 に答える
0

ないと思います。

これを解決する 1 つの方法は、もちろんライセンスが許す限り、関連するアーキテクチャごとの実装を Linux カーネル空間などからコピーすることです。私はこれらのプリミティブの進化を詳しく追跡していませんが、それらは確かにプリミティブであると推測します。つまり、カーネル内の他のサービスや API に依存していません。

于 2009-07-15T08:04:37.500 に答える
0

私の知る限り、アトミック操作を行うためのクロスプラットフォームの方法はありません。そこにライブラリがあるかもしれませんが、私は知りません。ただし、自分でロールするのは特に難しいことではありません。

于 2009-07-15T08:01:50.753 に答える