- PR -

VBにも.NetでThreadingがやってきた

1
投稿者投稿内容
ふうすけ
常連さん
会議室デビュー日: 2002/02/21
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2002-03-05 21:35
C#入門最終回でThreadingが出てきましたね、C++でThreadingしまくりだった私としては、.NetでThreadingがらみがどう変わるのか興味大でした。(そこまでさわれる時間も取れずにいましたが)

私は、C++の時は、こんなクラスをロックに多用していました。

コード:
class Lockable
{
public:
    virtual void Lock() = 0;
    virtual void Unlock() =0;
};

  // これはロックの仕方により色々存在
class CriticalSection : public Lockable
{
    CRITICAL_SECTION crit;
public:
    CriticalSection() { ::InitializeCriticalsection(&crit); }
    ~CriticalSection() { ::DeleteCriticalSection(&crit); }
    virtual Lock() { ::EnterCriticalSection(&crit); }
    virtual Unlock() { ::LeaveCriticalSection(&crit); }
}

class Lock
{
    Lockable* lockable;
public:
    Locker( Lockable* lm ) : lockable(lm) { lockable->Lock(); }
    ~Locker( ) { lockable->Unlock(); }
};

/* ----- */
List list;
CriticalSection critList;

// thread A
{ 
    Lock lk(&critList); 
    list.pushBack( x ); 
}

// thread B
{
    Lock lk(&critList);
    if( !list.IsEmpty() ) { x = list.popFlont(); }
}


コンストラクタ、デストラクタにロック アンロックを結びつける事でスコープがロック範囲を示すという方法です。
 C#入門に出てきたlockはC#の言語仕様の一部の様ですが、Lockは何らかのインターフェースを叩いてくれる物なんでしょうかね?(System.Threadingでは見つかりませんでしたが)
 でないとSingle Writer Multi Readerモデルとか、Semaphoreとかを実現するのは結構つらいなぁ…等と思いました。

 オブジェクト全体をロックしてしまうのはロック競合とかでパフォーマンスをかなりロスしそうな気もしますし、(かといって細かいロックを作るとデッドロックしたりするのですが)

 ちょっと確認したところではWebService等はマルチスレッドで実行されているようなので、グローバル変数などは確実に競合問題を抱えそうな気もします。
 特に、VBプログラマが入ってくると「Threading?なにそれ?」になりそうで…

 こういうThreading問題まで含めた.NetでのWebアプリケーションの設計に関する情報ってどっかに有りますかね?
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-03-06 01:47
引用:

ふうすけさんの書き込み (2002-03-05 21:35) より:
C#入門に出てきたlockはC#の言語仕様の一部の様ですが、Lockは何らかのインターフェースを叩いてくれる物なんでしょうかね?(System.Threadingでは見つかりませんでしたが)



C#のlockは、System.Threading.Monitorを使います。たとえばこんなのは、
コード:

static void ThreadProc() {
lock(typeof(myclass)) {
Console.WriteLine("h");
}
}


こんな風に展開されます。
コード:

Type t = typeof(myclass);
System.Threading.Monitor.Enter(t);
try {
Console.WriteLine("h");
} finally {
System.Threading.Monitor.Exit(t);
}



引用:

でないとSingle Writer Multi Readerモデルとか、Semaphoreとかを実現するのは結構つらいなぁ…等と思いました。



System.Threading.ReaderWriterLockがありますよ。

引用:

ちょっと確認したところではWebService等はマルチスレッドで実行されているようなので、グローバル変数などは確実に競合問題を抱えそうな気もします。
特に、VBプログラマが入ってくると「Threading?なにそれ?」になりそうで…



.NET Frameworkでスレッドを扱うときにもっとも重要なのは、Delegateだと思います。Delegateはスレッディングを隠蔽するので、VBプログラマもその使い方だけ正しく知っておけば、基本的には問題ないかと。

スレッディングはいずれにしろデッドロックと背中合わせなので、慎重に使うかどうかの判断をしなければならない、ということには賛成です。が、.NET Frameworkはそういったことも含めて面倒を見てくれる「フレームワーク」なので、ほとんどの場合は、フレームワークに任せるのが王道だろうと思います。

[ メッセージ編集済み 編集者: NothingBut.NETFX 編集日時 2002-03-06 14:13 ]
ふうすけ
常連さん
会議室デビュー日: 2002/02/21
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2002-03-07 17:50
 System.Threading.Monitorですか…うみゅ、いよいよわからなくなった。
 こいつ、Sealedですよね、ロック処理を置き換えることでThreadingポリシーを適用するわけではないんですかね…

 あるオブジェクトが Single Writer Multi ReaderのThreadingポリシーを持つ場合…
 もしや、C#のlockそのものが使えないのか?

コード:
class XX  
{
    System.Collections.ArrayList listX;  // こいつには SWMR Threadingしたい
    System.Threading.ReaderWriterLock rwlock;

    public int countX 
    {
        get {
            // ここでは Readerとしてロックして個数を取得したい
            // lock( rwlock.reader ) {  }  と書きたいが、無理っぽい
            // 結果としてこう?
            try {
               rwlock.AcquireReaderLock( TIMEOUT );
               …
            }
            finaly {
               rwlock.ReleaseReaderLock();
            }
        }
    }

    public void AddX( X toadd )
    {
        // ここでは Writerとしてロックして追加したい
        // lock( rwlock.writer ) {  }  と書きたいが、無理っぽい
        …
    }
}


 実際には個数を取ってロックから出てしまっては個数が当てにならなくなるのでこんなに簡単な設計にはならないはずなのですが、これぐらいで言語の一部が破綻しないで欲しいなぁ。


 しかし、DelegateがThreadingを隠蔽するというのは知りませんでした。
 ということは Delegateを通る時にThread境界を渡る事がある(できる)という事でしょうか???、いよいよよく判らなくなってきました。
 もうちょっと色々試さないと判らないですね、基本はフレームワークに隠蔽して貰って気にせずに使うのが一番なんですが、いざアクセスの激しいWebServiceなんかを作ると突然デッドロックしたり、予定していたパフォーマンスが出なかったり、いろいろ起こりそうな気がしてきました。
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-03-07 20:18
すみません、取り急ぎ。

もうお分かりと思いますが、lockはC#のシンタックスシュガーにすぎません。スレッディング機構のようなものではないと思います。

むしろdelegateのほうがフレームワークのスレッディング機構に近いのではないかと。
1

スキルアップ/キャリアアップ(JOB@IT)