sharedについて

投稿ツリー


このトピックの投稿一覧へ

なし sharedについて

msg# 1
depth:
0
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 .5 .6 | 投稿日時 2009/9/25 20:49 | 最終変更
SHOO  管理人   投稿数: 658
ネタ元: [http://d.hatena.ne.jp/haru-s/20090925/1253864045 ...ing logging 3.0 - synchronized その3(haru-sさん)]

グローバルのデータ以外にsharedをつけた場合、shared型になったりshared classになったり、shared関数になったりしますが、これらのsharedはどんな役割をもったものなのでしょうか?

その変数に対する操作がアトミックな操作になるのではないか?と仮説を立ててコードを組んでみましたが、どうやら偽であるようです。
反例)
#code(d){{{
import core.thread;

class SharedTester
{
shared int a;
shared void inc()
{
a++;
}
shared void dec()
{
a--;
}
shared int get()
{
return a;
}
}

void main()
{
auto tg = new ThreadGroup;
auto sd = new shared(SharedTester);
foreach (x; 0..10)
{
tg.create=()
{
foreach (i; 0..1000000) sd.inc;
};
tg.create=()
{
foreach (i; 0..1000000) sd.dec;
};
}
tg.joinAll;
assert(sd.get() == 0);
}
}}}
高確率でassertに引っかかる…


shared型にしても、制限がきつくて使い勝手が悪い気がするのですが…
たとえば、いかなるスレッドから呼び出したとしても、データの破壊を起こすことのないsharedメンバ関数、と仮定したとしても、shared型のオブジェクトでないものから呼び出せないのはおかしい気がしますし、そうでないとしたら、synchronized修飾でshared関数になる理由がわかりません。
なぜsharedメンバ関数は、非sharedオブジェクトから呼び出すことができないのでしょうか?

現状の型の種類は5種類…オブジェクトの型と、メンバ関数の呼び出しの可否をまとめてみました。
| - | 通常関数 | const関数 | shared関数 | const shared関数 | immutable関数 |h
| ~通常型 | ○ | ○ | × | × | × |
| ~const型 | × | ○ | × | × | × |
| ~shared型 | × | ○ | ○ | × | × |
| ~const shared型 | × | ○ | × | ○ | × |
| ~immutable型 | × | ○ | × | × | ○ |

const shared型からconst関数が呼べるのはいいのか?
immutable型からconst shared関数を呼べないのはなぜか?
個人的には謎なんですが、いかがなものでしょうか。
私の感覚だと↓のようになるんじゃないかなぁと思うのですが。
| - | 通常関数 | const関数 | shared関数 | const shared関数 | immutable関数 |h
| ~通常型 | ○ | ○ |COLOR(red): ○ |COLOR(red): ○ | × |
| ~const型 | × | ○ | × |COLOR(red): ○ | × |
| ~shared型 | × |COLOR(red): × | ○ |COLOR(red): ○ | × |
| ~const shared型 | × |COLOR(red): × | × | ○ | × |
| ~immutable型 | × | ○ | × |COLOR(red): ○ | ○ |


皆さんのご意見お聞かせください。
投票数:59 平均点:5.59
返信する

この投稿に返信する

題名
ゲスト名
投稿本文

  条件検索へ


メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu