[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 12637] Re: 議事録「 Java 並列処理プログラミング 」を読む会(第 9 回)
大石です。
前回は出席できずごめんなさい。
From: "TAKAHASHI, Tomohiro" <t_takahashi@xxxxxxxxxxxxxx>
>
> "TAKAHASHI,Toru" wrote:
> snip
> > アトミックな変数のライブラリJava以外は?
> > → WindowsはAPIあるらしい
> > InterlockedIncrement
> > InterlockedCompareExchange
> > InterlockedExchange
> > :
> > → UNIX系 なさそう? (宿題)
>
> 前のメールで書きましたが、
>
> Windows APIには、
> http://msdn2.microsoft.com/en-us/library/ms683614.aspx
> などにありますように InterlockedIncrement や InterlockedCompareExchange などのAPIがあります。
>
> MacOSX での Atomicな関数 ( Load-Link/Store-Conditional )としては、
> http://www.cocoabuilder.com/archive/message/cocoa/2002/6/23/56690
> などで紹介されているように IncrementAtomic や CompareAndSwap のような関数が公開されています。
>
> 次に、Solaris では、
> http://docs.sun.com/app/docs/doc/816-5168/6mbb3hr3n?a=view
> http://docs.sun.com/app/docs/doc/816-5168/6mbb3hr2m?a=view
> などで紹介されているように atomic_inc_32 や atomic_cas_32 のような関数が公開されています。
> 環境は、OS:Solaris10 CPU:SPARCx2 Compiler:SunSutdio11(CC) Debugger:dbx IDE:BorlandC++2005
> で試しました。
> コードは以下のようなもので、コンパイル時に -xarch=v9 を指定しました。
> ------------------------------------
> #include <iostream>
> #include <atomic.h>
> int main( int argc, char * argv[] )
> {
> volatile uint32_t x = 99;
> atomic_inc_32(&x);
> std::cout << x << std::endl;
> return 0;
> }
> ------------------------------------
> で、SolarisのDeguggerのdbxでatomic_inc_32にステップインしようとしましたが、入り方が
> 分かりませんでした。添付の画像しかありません。なので、機械語でどのようになっているのか
> 確認できませんでした。(^^;
>
> 次は、Linuxですね。。。
Linuxではないんですが、FreeBSDではアトミック操作を行う関数が
以下のように定義されています。
http://www.freebsd.org/cgi/man.cgi?query=atomic&sektion=9
興味深いのは、いくつかのアトミック関数にはメモリバリア効果を併せ持つ
変種があるという点です。
これはIA64の命令セットに影響を受けたのかもしれません。
各アーキテクチャでの実装を見比べてみると、いろいろと面白いです。
http://fxr.watson.org/fxr/source/i386/include/atomic.h
http://fxr.watson.org/fxr/source/ia64/include/atomic.h
http://fxr.watson.org/fxr/source/sun4v/include/atomic.h
--
大石将邦