MINIX使ってないので、「オペレーティングシステム―設計と理論およびMINIXによる実装」読んでも意味ないし
はあ。
Windowsは業界スタンダードだから意味あるはずだけどねえ
何業界だ?
Window業界でのはなしでしょう
windowsのイベントや、UNIXのsignalは、プログラマからみれば
APIとしてはコードのその場所でじっとwaitしてる形になると思うけど
イベントやsignal自体の内部実装(カーネル側?)
では結局はポーリングで実現されてたりするわけ?
エロゲー的にはポーリングが正義、というFAが出ておりますが何か?
割り込みにきまってんだろハゲ
>>933 イベントやシグナルみたいな大掛かりなものはスレッド自体が
待ち状態になってスケジュールしなおされる。
スピンロックで待つのはWin32でSMPのEnterCriticalSection(記憶違
いかも)とか、Windows の WDM のコードとか、linux のカーネル内の
コードとかでスケジューラを動かすまでもないホンのちょっとの排他
処理を行うとき。
なるほろ
今2wayの鯖あるのですが、2つのCPUを効率よく使って計算させようと思うと
スレッド間でメモリ共有するだけでいいでしょうか?何か気をつけることないですか?
意味若乱
逆になるべく共有リソースを無くして独立させる方が良いと思う。
共有してると、アクセス排他制御とか同期制御とかが絶対必要。
ていうかスレッドはメモリを共有してるもんでしょう
>>942 メモリ空間は共有してても、同じメモリアドレスを共有してなきゃ問題ないじゃん。
>>943 財布は共有してても生活空間は共有しない
という独立思考の高い夫婦モデルだな
まあ普通プロセス/タスク内のスレッド間ではメモリを共有してるけどな。
>>937 なんか変じゃない?
スレッドがスケジューリングされなきゃ、何時まで経っても他スレッドが実行されず、
状態が変化しないのと違う?
>>946 完全に協調型ならそうなりますな。
普通は外的要因で叩き起こされると思いまふが。
元の質問も、その答えも、高度すぎて意味がわからん
要するに、
>>937 > スケジューラを動かすまでもない
を「自分からyeild()しないで」等に書き直した方がいいって事ね。
そもそもSMPでスケジューラ等を実装するには、
スピンロック等の低レベルな排他機構が必要なわけで…
マルチスレッドと、ウィンドウプロシージャについて質問なんですが、
現在、通信系のプログラムを書いています。
あるデータを受信したら処理をして、その結果を送信元に返信する。
という関数があるのですが、
1).スレッドを作り、そのスレッドで処理をさせる。
2).ウィンドウプロシージャを作り、メッセージにデータのポインタを渡す。
ウィンドウプロシージャで処理を行わせる。
この2通りを考えてみたんですが、楽なのは2)です。
どっちの方法が有効でしょうか?
スレッドを使ってブロッキングでやるのが1番楽だと思う
こんにちは。
gcc(RHEL), MinGW(Win), Visual Studio .NET(Win)の各環境でC++を使って私用ミニツールなど
を作ったりして仕事してる、一介の営業マンです。最近はサービスでお客さん用のツールなんか
も作ったりし始めました。SE受注減らしてどうするんだって感じですが。
C/C++でのpthreadに関する質問です。
pthread_createでガーっと並列にスレッドを作って仕事をさせ、pthread_joinを回して終了を待つわけな
のですが、
pthread_joinはブロックするので、先頭のスレッドが長引いちゃうと後に続くスレッドが先に終わってても
ボケーっと待ってしまいますよね。
これを、スレッドが終了した順に処理する方法ってありますでしょうか?
よろしくお願いします。
例えばこんな風にすればいいんじゃない?
* 生きてるスレッド数を数えるカウンタを用意しておく。(スレッド数で初期化)
* 各スレッドは終わるときにカウンタを減らして、ゼロになったら pthread_cond_signal() みたいなことをする。
* メインは pthread_cond_wait() かなんかで待ち。
* 起こされた時にはスレッドは全部終わってるはず。
* もちろんカウンタをいじるときは排他制御。
あと、スレッドが終わる度になんかするなら、
* 各スレッドは終わるときにカウンタを減らして、 pthread_cond_signal() みたいなことをする。
* メインは pthread_cond_wait() かなんかで待ち。
起きたときにカウンタがゼロになってたら全部終わってるはず。
どうせ全部まとめて終了を待つなら、順番にjoinするだけで何の問題もないと思うけど。
メインスレッドはワーカースレッドを終了を順次待ちつつ何かしてる必要があるなら、
キューを用意してスレッドが終了前に自分のpthread_tを追加するとか、
メインスレッドがイベントループなら終了を通知するイベントを投げるとか。
960 :
デフォルトの名無しさん:2005/09/22(木) 19:33:15
> 全部まとめて終了を待つ
逆です
早く終わったスレッドの順に次のジョブキューに入れるやり方ですね
それならスレッドプールでしょ
元の質問文と真実の内容がかけ離れてんな
>>960 >早く終わったスレッドの順に次のジョブキューに入れるやり方ですね
その場合はスレッド終わっちゃいけないから、joinなんか使えないと思われ
リスト構造にしたらいいんじゃね?
>>963 pthread_cleanup_push()で登録するとか。
966 :
956:2005/09/29(木) 20:31:03
つまりこんなかんじ?
1. 子スレッドはその仕事の最後にグローバル関数で
「俺は終わりましたフラグ」を立ててから死ぬ
2. メインのスレッドは全部の子スレッドの「俺は終わり
ましたフラグ」を監視しながらぐるぐる回ってる
3. あるスレッドの「俺は終わりましたフラグ」が立ったら、
そのスレッドの計算結果を取得して次の仕事に放り込む
んー、スレッドの数が不定なので、俺は終わりましたフラグの
作り方と監視の仕方の実装に工夫が要りそうですね。
>>956 なぜスレッドを使って並列でしようとしてるのかが見えないんだけど・
本当にマルチスレッドにする必要あるのかな
リスト構造でやってみたらと・・・
//スレッドに持っていく構造体
typedef struct tag tag;
struct tag{
tag *next;//初期化してNULLにしておく
・・・
};
//メインが持つグローバルデータ
tag *root;
tag *last;
int flg;
計算が終わった子は
flgが特定の値であれば待機。
flgが特定の値でなければ特定の値にして
rootがNULLでなければlast->nextに自分の構造体のアドレスを登録。
rootがNULLであればrootとlastに自分の構造体のアドレスを登録。
メインスレッドは
flgが特定の値であれば待機。
flgが特定の値でなければ特定の値にして、
構造体のデータを取り出す。
root=root->next;とする。
flgの値を戻す。
ま、こんな感じでどうざんしょ。
>>966 漏れならこうするよ。
メインスレッド
1. ジョブをキュー(FIFO)に登録。
2. ワーカスレッドを妥当な数だけ生成
3. pthread_cond_wait() か何かで待ち、ジョブのキューが空になっていたら完了。
ワーカスレッド
1. ジョブをキューから取り出して実行
2. 完了したら、その結果を利用した「次の仕事」を(もしあれば)ジョブキューに入れる。
無ければスレッド終了。
3. 1に戻る
pthread_cond_waitとかpthread_cleanup_pushとか、クレバーなコーディングはご法度
クリティカルセクションとミューテクスはどちらがお勧めなのでしょうか?
ダンディーな方、教えてくださいませ。
>>972 オススメと言うか、その2つは使い分けるもの。
Win32の場合の話だけど、
プロセス内でのスレッドの同期程度ならクリティカルセクションを用いる。
複数のプロセスで排他を行いたいなら、ミューテックスの類を使う。
SMPで無ければ効率は同じ。SMPの場合にはInitializeCriticalSectionAndSpinCount の説明を参照。
>>973さん
なるほど、納得しました!
どうもありがとうございました。
>>974 まだあった・・
複数の同期オブジェクトを待ったり、待っている最中にWindowメッセージや
COMのLRPC(外部スレッド/プロセスからのCOM呼び出し)を処理する必要
があるなら Mutex。
>>975 色々違いがあるんですね。
ご丁寧に有難うございましたm(_ _)m
977 :
デフォルトの名無しさん:2005/10/11(火) 23:14:03
age
お舞らたとえばですがファイルの内容をメモリ上に展開しそこにほかのスレッドがアクセスする必要があるとしたらどんな風に書きますか?
・データは木構造
・IOからメモリに展開するスレッドは複数
・そこにUI スレッドや、計算スレッドが頻繁にアクセスする。リーダーとライターが複数ずついる。
・ためしにクラスレベルロックみたいのでやったらUIスレッドでCPUが100%言ってないのにたまに固まる(1秒以下)ことがある。
こういう場合ってどんな風にするもんなんでしょう。粒度さげると書くのが('A`)マンドクさくなるしデッドロックの危険も出てくる。
一般解や俺ならこうしてるってのがあればよろ。