[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

-- 
大石将邦