- PR -

ライブラリで作られるスレッドと同期するには?

1
投稿者投稿内容
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-08-12 01:31
メインスレッドから、ライブラリにあるサーバに実行を依頼します。すると、サーバは自前のスレッドを使って処理をおこない、終了するとコールバックが帰ってきます。
普通はこれで問題ないのですが、コールバックが帰ってくるまでの間メインスレッドを待機させたいケースが出てきました。とりあえず以下のように実装してみて、一応は動くのですが…

void Main()
{
// 前略
server.Process(); // サーバ内での非同期実行開始
m_CurrentThread = Thread.CurrentThread;
m_CurrentThread.Suspend();

// 後略(この部分は、サーバの実行後に実行したい)
}

void CallbackOnCompletion() // サーバのスレッドでコールされる
{
m_CurrentThread.Resume();
}

非常に危険な雰囲気が漂っています。もっとよい方法は無いのでしょうか?

サーバのコードはライブラリで提供されており、コールバックが来るまでは、自分のコードからスレッドにアクセス出来ません。サーバ側のコードにMonitorやMutexなどを追加するのは人間的・部署的な理由で難しそうです。それしか方法が無いのなら変更を求めることは出来るかもしれませんが…。

どうぞよろしくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-08-12 02:11
引用:

非常に危険な雰囲気が漂っています。もっとよい方法は無いのでしょうか?

サーバのコードはライブラリで提供されており、コールバックが来るまでは、自分のコードからスレッドにアクセス出来ません。サーバ側のコードにMonitorやMutexなどを追加するのは人間的・部署的な理由で難しそうです。それしか方法が無いのなら変更を求めることは出来るかもしれませんが…。



メインスレッドで Mutex を用意して、コールバックでシグナルにすればいいんじゃないでしょうか。

がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-08-12 06:55
渋木さん、どうも有り難うございました。
結局、Monitorで解決することにしました。

どういうわけか、Monitor の Enter と Exit の間で処理をしなければならない気になっていたので、サーバ側の変更が必要だと思い込んでいました。Waitの方でもPulseの方でも処理を囲う必要はないことに気づけば非常に簡単でした。渋木さんのヒントのおかげで気づくことが出来ました。

void Main()
{
// 前略
server.Process(); // サーバ内での非同期実行開始

Monitor.Enter(this);
Monitor.Wait(this, 1000);
Monitor.Exit(this);

// 後略(この部分は、サーバの実行後に実行したい)
}

void CallbackOnCompletion() // サーバのスレッドでコールされる
{
Monitor.Enter(this);
Monitor.Pulse(this);
Monitor.Exit(this);
}

1

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