tommieです。

(2013/04/09 9:10), Shigeki Ohtsu wrote:
> 大津です。
>
>
> worker 内で thread local でない async.data をロックせずに操作しています
> が、本当に大丈夫なんでしょうか?

キュー経由でメッセージ送信するようにしました。

> 検証しました。
>
> https://gist.github.com/shigeki/5341670
>
> worker 内の sleep(1) を外して、固定回ループにしてます。
> どうでしょうか?

お手間取らせて申し訳ないです。

forkして変更しました。

https://gist.github.com/open-tommie/5342559

変更点、ログの解説などをreadme.txtに書きました。
以下、readme.txtから。

●main.c変更点

・ワーカー関数をひとつにしました。
 fake_download1(), after1()を削除。

・fake_download0()内で使用していたmsgは
 スタック変数であり、スレッドセーフではないので
 malloc()で取得したヒープ上メモリ領域を使うように変更しました。(main.c
48行目)
 使用済みメモリ領域はprint_progress()内でfree()しています。(main.c 33行目)

・uv_async_send()を実行してからprint_progress()が呼ばれる間に
 複数回uv_async_send()が呼ばれても、print_progress()の実行は1回だけ
 です(uv_async_send()の仕様)。
 この場合、全てのmsgが処理されるわけではない、ということになります。
 これを防ぐ為に、async.dataでmsgを送信するのをやめて、
 代わりにmsg用のキューg_msgQueueを使いました。(main.c 26〜28, 53行目)
 uv_async_send()はprint_progress()呼び出しタイミングを通知するだけにな
りました。

・STLのqueueはスレッドセーフではないので、queue操作の前後に
 uv_mutex_lock(), uv_mutex_unlock()を加えて、
 スレッドセーフにしています。



ご意見募集です。

> Node.js初期化関数って何を指して仰ってるのかわかりませんが、
> 仮に node::Start() を指すとしたら uv_run() でブロックしちゃいますけど…

C++部分も、Node.js同様にイベント駆動でプログラムを書きます。
libuvを用いたC++プログラム同様、
node::Start()のuv_run()のイベント処理でC++関数が呼ばれるようにします。
そうれば、Node.jsとC++が混在できますよね。
もちろん、アドオンのように、C++ ⇔ Node.jsの型変換や
Node.js関数としての登録などは必要になります。

以上。

-- 

--- 
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、[email protected] にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。


メールによる返信