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 にアクセスしてください。
