07/10/22 23:47:52
>>236
横から。わたしもよくわかってないが
1.コンパイラやlibcが提供するatomic_inc/dec関数だけでは、単一CPUでのアトミックな演算しか保証されない
2.適切な命令(バリア)と一緒に使えば、複数のCPUを相手にatomicなinc/decができる (memory visibilityがどーたら)
3.どういうバリアが必要かは場合によって異なるから、コンパイラやlibcが提供するatomic_inc/dec関数にはバリアが入っていないことがある
こんなところじゃない?詳しい人フォローよろ。
238:237
07/10/22 23:52:39
>>237
1と2の末尾にも「ことがある」を追加
239:デフォルトの名無しさん
07/10/23 00:24:36
あー、そういう実装の既存の関数があるのね。
そこまで分かってるなら前後にメモリバリア足せばおしまいじゃね?
240:デフォルトの名無しさん
07/10/23 00:29:35
つーかvolatileで十分w
241:デフォルトの名無しさん
07/10/23 00:30:04
atomic_inc/readはlinuxのカーネル系の関数のようだね。
pthreadのような高位のAPIを使わない理由はなんだろう?
パフォーマンスを気にするようなアプリなのか。
242:203
07/10/23 00:31:23
>>241
pthreadにします。
243:デフォルトの名無しさん
07/10/23 09:00:33
>>240
キタ━━━(゚∀゚)━━━ !!!!!
244:デフォルトの名無しさん
07/10/23 09:41:51
SPARCv9なら、CASがあるよ。
245:デフォルトの名無しさん
07/10/23 17:58:33
linuxのCでスレッドの排他制御をしたいのですが、
なにぶんPONIX?っていうんですか?での開発は初めてなので
ご質問させてください。
pthread_mutex_t mutex;
pthread_mutex_init( &mutex, NULL );
pthread_mutex_lock( &mutex );
pthread_mutex_unlock( &mutex );
PONIXではこのようにpthread_mutex_lockを使うようですが
この引数pthread_mutex_t*をWin32のCreateThread()のように
ある共通の識別子を持っているスレッド同士のみが排他制御を
するにはどのようにすればよいのでしょうか?
例えば同じ親から4つ子のスレッドが生まれたとします。
スレッド長男と次男は排他関係
スレッド長女と次女も排他関係
でもスレッド男兄弟とスレッド女姉妹は排他関係ではない
という場合です。
246:デフォルトの名無しさん
07/10/23 18:11:09
必要なだけ mutex を作って、自分で識別子と mutex の対応付けを管理する
247:デフォルトの名無しさん
07/10/23 19:33:13
>>246 ありがとう。
248:デフォルトの名無しさん
07/10/23 21:15:18
自分でご質問とか言うなよ
249:デフォルトの名無しさん
07/10/23 21:29:36
なぜ?
250:デフォルトの名無しさん
07/10/23 21:40:30
自分がする質問だから
「あなたのご質問には答えられません」
なら、相手を持ち上げている
「私のご質問に答えてください」
なら、自分を持ち上げている
日本人として変であることに気づくべき
251:デフォルトの名無しさん
07/10/23 21:42:00
あほか
美化語を知らんのか
252:デフォルトの名無しさん
07/10/23 21:47:44
おトイレならわかるがご質問はないな。
「ご質問はありますか」は当然あり。
253:デフォルトの名無しさん
07/10/23 21:50:16
尊敬と謙譲の概念しか無いようだな。
254:デフォルトの名無しさん
07/10/23 21:51:34
板違い
よそでやれ
255:デフォルトの名無しさん
07/10/23 21:52:09
使い方が間違っているんだよ。
それを気づくことができないのか?
256:デフォルトの名無しさん
07/10/23 21:54:16
>>255
>>254
257:デフォルトの名無しさん
07/10/23 21:57:17
>>254
いやいや、質問する上でのマナーの話だからここで良い
マナーを守れない方がどっか行くべき
258:デフォルトの名無しさん
07/10/23 22:00:35
>>257
いやいや、ご質問する上でのマナーのお話だからここで良い
おマナーをお守りできない方がどっかへ行くべき
259:デフォルトの名無しさん
07/10/23 22:36:01
いや、マナーってほどの話ではないとおもう
変な日本語を使ってるけど、意味は理解できるから問題ない
てなわけで、おスレち
260:デフォルトの名無しさん
07/10/23 22:41:30
やっぱ誰でもアクセスできるローレベルな話のほうが伸びるなw
261:デフォルトの名無しさん
07/10/23 22:42:45
すまんなw
おれも、なんか参加しちゃってるよw
262:デフォルトの名無しさん
07/10/23 22:44:37
しょうがねーな
俺も参加してやろうか
263:デフォルトの名無しさん
07/10/23 22:46:22
僕もご参加していいですか?
264:デフォルトの名無しさん
07/10/23 23:25:29
どうぞ、ご参加ください。
265:デフォルトの名無しさん
07/10/23 23:36:57
珍しく盛り上がってると思ったら・・・
>>244
コード例
266:デフォルトの名無しさん
07/10/24 01:46:21
ひさびさに来ましたよー
相変わらずスレ違いにはレス多いね。
267:デフォルトの名無しさん
07/10/24 01:59:52
スレッドの呼び出しコストってどうやってはかるの?
組込み用でmutexとかの関数の呼び出しコスト一覧
表作り単位んだけどどうしたらいいん?
268:デフォルトの名無しさん
07/10/24 02:27:13
>スレッドの呼び出しコスト
具体的にどういう意味と受け取ったらよいのだ?
269:デフォルトの名無しさん
07/10/24 02:38:38
適当なタイマーで挟んではかr
270:デフォルトの名無しさん
07/10/24 08:11:41
>>265
URLリンク(developers.sun.com)
Standard Library, STL and Thread Safety
Atomic updates for reference counting
URLリンク(www.sparc.com)
J Programming With the Memory Modelsにいろいろ
J.6 Spin Locks(Example 8―Lock and Unlock Using CAS)
J.11 Fetch_and_Add(Example 15―Fetch and Add Using CAS)
J.12 Barrier Synchronization(Example 17―Barrier Synchronization Using CAS)
J.13 Linked List Insertion and Deletion(Example 18―List Insertion and Removal)
271:デフォルトの名無しさん
07/10/24 09:27:41
>>270
ktkr
272:デフォルトの名無しさん
07/10/25 08:14:03
C++でのマルチスレッドに関する質問です
class sample{
private:
int i;
HANDLE hEvent;
public:
sample(){
hEvent = CreateEvent(NULL, TRUE, TRUE, L"sample");
}
~sample(){
CloseHandle(hEvent);
}
void fSetdate(int _i){
WaitForSingleObject(hEvent, INFINITE);
ResetEvent(hEvent);//ロック開始
this->i = _i;
SetEvent(hEvent);//ロック解除
}
int fGetdate(){
WaitForSingleObject(hEvent, INFINITE);
ResetEvent(hEvent);//ロック開始
int _i = this->i;
SetEvent(hEvent);//ロック解除
return _i;
}
}
273:272の続き
07/10/25 08:17:17
上記のクラスをひとつだけインスタンス化して、
複数のスレッドがそれを呼び出した場合、データの同期化は成立しますか?
274:デフォルトの名無しさん
07/10/25 09:08:53
何が死体のこれ?
275:デフォルトの名無しさん
07/10/25 09:18:17
別々のスレッドがfSetdateのResetEventに同時に到達した場合どうすんの?
276:272の続き
07/10/25 09:39:20
あべし
クラス内部でイベントによってデータの同期をとろうと思ったんですよー。
277:デフォルトの名無しさん
07/10/25 10:03:47
何でCriticalSection使わんの?
278:272
07/10/25 10:27:32
>>277
イベントと違いがわからんっす
279:デフォルトの名無しさん
07/10/25 11:26:21
イベントを理解しとらんからだろ。
それで同期ってなにが目的なのよ?
280:デフォルトの名無しさん
07/10/25 11:44:13
正解を書きたいけど、それをコピペして終了されると悲しいので
ここは是非MSDNのドキュメントを読むなりして頑張って欲しい。
281:デフォルトの名無しさん
07/10/25 13:10:53
>>278
イベントとクリティカルセクションがどう違うかなんて、腐るほど説明があるから
いちいち書きたくないが、簡単に言うと
・イベント
遅い
プロセス間の同期に使える
・クリティカルセクション
速い&簡単
スレッド間の同期にしか使えない
あと、その目的でイベントを使うなら自動リセットイベントを使う。
そのコードだと275の懸念していることが、起こるかもしれないという
レベルではなく、確実に起こる。
282:デフォルトの名無しさん
07/10/25 13:20:09
何をどう同期したいのか分からんから起こっても変わらん気がするw
283:デフォルトの名無しさん
07/10/25 15:43:08
>>281
初心者に、あまり適当なこと教えるなよ。
それはどちらかというと、MutexとCRITICAL_SECTIONの違いだろ。
EventとCRITICAL_SECTIONの違い、あるいはpthreadにおけるcondとmutexの違いは
同期(実行をコントロールする)か排他(データを保護する)か。
284:272
07/10/25 18:24:31
みなさんどうもっす。
同期について根本的に勘違いしてました。
データの保護ではCriticalSectionを使うのですね。
でもEnterCriticalSection()が同時に
実行されるということはありませんか?
285:デフォルトの名無しさん
07/10/25 18:31:20
そんな質問が出るってことは
まだCriticalSectionについてググってすらいないようだな…。
286:デフォルトの名無しさん
07/10/25 20:26:43
>>284
>でもEnterCriticalSection()が同時に
>実行されるということはありませんか?
わらった。
そりゃ同時に実行されるさ。そのためのものだもん。
287:デフォルトの名無しさん
07/11/12 14:38:05
質問。
今のところはlinuxのpthreadのみを使っていますが、
なるべく一般のスレッドで使えるようにしたいと考えています。
複数のスレッド(X,Y,...)があってそれぞれが独立に動き、
読み込みアクセスrdと書き込みアクセスwrをします。
排他の条件は
1) XのrdとYのrd =>排他しない
2) XのrdとYのwr =>排他する
3) XのwrとYのwr =>排他する
4) XのwrとXのrd => 排他しない(wrの中からrdすることがあるので)
となっています。
自力で考えた手法はrwlockを使っています。
4)の条件を満たすためにrでロックする際はtryrdlock()して
・返り値がEDEADLKなら自スレッドがwrlockしているとみなしてロックせずに通す
・それ以外なら他スレッドがwrlockしているとみなして待機する
としています。
この手法で移植性は十分でしょうか?
288:デフォルトの名無しさん
07/11/12 14:58:54
移植性っても、どの程度を考えてるかによるけど、例えば Windows には reader writer lock がそもそもなかったような…
289:デフォルトの名無しさん
07/11/12 22:10:34
visutaから追加された。
290:デフォルトの名無しさん
07/11/12 22:15:25
びじゅた?
291:デフォルトの名無しさん
07/11/12 22:25:14
一般のスレッドって何だよ
292:デフォルトの名無しさん
07/11/12 22:38:23
なんで4)でrdロックする必要あるの?
293:デフォルトの名無しさん
07/11/12 23:47:18
ぴゅうた以来
プログラムかいてねーから
鈍ってしまって困った
294:デフォルトの名無しさん
07/11/13 09:52:33
返答ありがとうございます。
>>288
Windowsのスレッドは触ったことがなく、rwlockがないことを知りませんでした。
>>292
rwlockの状態を知るためにtrylock()しています。
pthreadに現在の状態を問い合わせる関数が見付からなかったのでこのようにしました。
(一般には現在の状態を問い合わせても
次のステップまでその状態が持続するとは限らないことは承知しています)
mutexからrwlockを実装するというのを本で読んだことがあるので
それを参考に実装してみます。
295:デフォルトの名無しさん
07/11/15 00:30:34
Linuxでpthreadを使用しているのですが
valgrindで実行するとfopenとfcloseの箇所で以下のエラーが大量に出ます。
==25540== Possible data race reading variable at 0x1D52238C
==25540== at 0x674CB5: _IO_un_link_internal (in /lib/tls/libc-2.3.4.so)
==25540== by 0x668A5D: _IO_fclose@@GLIBC_2.1 (in /lib/tls/libc-2.3.4.so)
==25540== Address 0x1D52238C is 52 bytes inside a block of size 352 alloc'd by thread 1
==25540== at 0x1D4A8090: malloc (vg_replace_malloc.c:131)
==25540== by 0x66935E: __fopen_internal (in /lib/tls/libc-2.3.4.so)
==25540== by 0x66941C: _IO_fopen@@GLIBC_2.1 (in /lib/tls/libc-2.3.4.so)
Webで調べるとglibcはすべてスレッドセーフだと書かれているのですが
同期とかしないといけないのでしょうか?
詳しいかた教えてください。
296:デフォルトの名無しさん
07/11/15 03:10:57
helgrind使ってるって事?
あとさ、glibc-2.3.4って偉い古いな。
297:デフォルトの名無しさん
07/11/15 03:13:19
関数がスレッドセーフであるかと同期が必要かは別問題
298:デフォルトの名無しさん
07/11/15 03:40:30
>>295
同じdescriptorを同時にopen/closeしにいったらまずいわな。歯痛汁。
299:295
07/11/15 12:29:07
>>296
CentOS4.5でhelgrind(valgrindは2.2)です。
yumしてみましたがglibcのバージョンは2.3.4が最新でした。
>>297
すみません、語弊がありました。
glibcがスレッドセーフでないならなにか回避策がないと
スレッドでは使用できなくなってしまうので一般的にはどうするのかなと。
>>298
すみません、説明が足りませんでした。
ファイルのオープン、リード、クローズは
すべて同一のスレッド内で行っています。
300:295
07/11/15 12:30:35
みなさん遅くにありがとうございます。
もう少し調べてみます。
301:デフォルトの名無しさん
07/11/15 22:26:00
valgrind3.3まで待ったら?
302:デフォルトの名無しさん
07/11/17 00:08:19
同僚に嫌がらせするだけのために
valgrind --tool=erogrindって
オプション作って
オワタって表示されるようにしたんだけど
さっきめっさ怒られたw
303:デフォルトの名無しさん
07/11/17 20:28:57
思いつきだが、最新のvalgrindのsupression fileを使ってhelgrindしてみるのはどうだろうか。
304:デフォルトの名無しさん
07/12/18 09:21:07
Linuxを使った組込機器の開発に、NPTLではなくLinuxThreadsというのを使うことになりました。
これは聞くところによると、あまりOSに頼らずに実装されたスレッドライブラリということですが、
たとえばpthread_mutex_lock関数はどのように実装されているのでしょうか?OSのシステムコール
を呼ばない形で実装されているのでしょうか?
ソース嫁かもしれませんが、詳しい方いらっしゃいませんか?
305:デフォルトの名無しさん
07/12/18 09:55:20
URLリンク(www.linux.or.jp)
306:デフォルトの名無しさん
07/12/18 11:18:26
アトミックオペレーションができるインストラクションをインラインアセンブラーで記述する事で実現している
307:デフォルトの名無しさん
07/12/18 21:23:24
しばらくspinしてもロック獲得できなかったらRTシグナル街に入るんだっけ?
それはともかく、俺は完全ユーザ空間な1:Nスレッドの実装方法、特にどうスレッドをスケジュールするのかがさっぱりわからない。
308:デフォルトの名無しさん
07/12/18 21:48:30
green thread
309:デフォルトの名無しさん
07/12/18 21:49:42
>>308
解説よろ
310:デフォルトの名無しさん
07/12/19 23:15:10
pthread規格で、
・端末で^CしたときのSIGINTシグナルは、どのスレッドに届くのか(あるいは全スレッドに届くのか)
・メインスレッドがexit()するとその他のスレッドは終了するのか
・メインでないスレッドがexit()したときはどうか
がわかりません。規格上どうなっているか、あるいは最近のLinuxでどうなるか教えていただけないでしょうか?
手元にSolarisしかなくて困ってます。
あ、main関数を実行したスレッドを勝手にメインスレッドと呼びました。
311:デフォルトの名無しさん
07/12/19 23:39:05
>>310
プロセス宛てのシグナルは、どれか一つのスレッドに届く。どれに届く
かは決められていないので、受け取りたいスレッド以外ではそのシグナ
ルをブロックするようにしておく。
exit()でプロセスが終了する。スレッドは関係ないはず。
312:デフォルトの名無しさん
07/12/19 23:39:21
スレッドセーフレベルの統一的な呼称ってあります?
引数がスレッドセーフじゃないとか条件付の状態とかあるよね。
313:デフォルトの名無しさん
07/12/20 11:07:35
シグナル受け専用スレッドって作る?
314:デフォルトの名無しさん
07/12/22 20:32:00
waitして何かあったらコールバックしてる。
315:デフォルトの名無しさん
07/12/23 19:58:10
pthread_cond_wait()でspurious wakeupが起こるのって具体的にはどういうときでしょうか?
どういう順番で、各スレッドの実行や切り替えが起こった場合でしょうか?
316:デフォルトの名無しさん
07/12/23 20:05:52
.NETのMonitor.Waitでもおこるかどうか知ってる人いませんか?
317:デフォルトの名無しさん
07/12/23 20:14:35
3000円ちらつかせると
解ってくるかもしれないw
318:デフォルトの名無しさん
08/01/01 20:48:11
>>315,316
マルチスレッドプログラムは基本的に非同期なので、何がおきても対応できるように冗長に作っておいたほうがいいと思う。
319:デフォルトの名無しさん
08/01/01 23:44:58
>>318
何も言ってないのと同じw
「基本的に」「何がおきても」「冗長に」って.....いかにも何も判ってない奴が使いそうなワードを連発されてもなぁ。
320:デフォルトの名無しさん
08/01/02 00:04:00
代わりに君が内容の有る事を言ってもいいんだよ
321:デフォルトの名無しさん
08/01/02 00:20:32
そんなものが書けると思っている段階でダメダメ
322:319
08/01/02 00:24:53
>>315 >>320
まず、cond_waitしているスレッドがシグナルを受信し、cond_waitがEINTRで戻った場合。
もうひとつ、これをspurious wakeupと呼ぶかは語の定義によるが、cond_wait中のスレッドがwakeさせられた際、
mutexをlockする前に別のスレッドがmutexを先にlockし、条件を偽にした場合。
どちらも、POSIXでは起きてよいことになっているけど、本当に起こり得るかどうかは実装による。
>>316
知らん
323:デフォルトの名無しさん
08/01/02 00:34:36
>>316
URLリンク(research.microsoft.com)
これの5.2
324:デフォルトの名無しさん
08/01/02 00:38:35
>>295
去年の12月にhelgrindの新しいの出たらしいよ。
325:デフォルトの名無しさん
08/01/03 09:46:44
>>295
複数のスレッドからアクセスすれば
"Possible" data race
になるのは当然なような
俺はそういう作り方はしない
326:デフォルトの名無しさん
08/01/05 01:33:19
>>295
ファイル操作用のスレッドかなにかに
終了通知送って閉じさせろよ
資源の管理はよほどの事情ないかぎり
一括にしろ
いいなわかったか?反論するなら
お前の家にそれは末恐ろしいものを
いくつかぶちまけて逃走するからな?
いいかわかったか?
327:デフォルトの名無しさん
08/01/06 23:38:52
C言語でマルチスレッドに挑戦していまして、
複数の子スレッドを途中停止させ、また再開できるような状態にしたいのですが、
いい方法はありませんか?
328:デフォルトの名無しさん
08/01/06 23:41:50
>>327
Cでどうやるのか忘れたけど、イベントなりセマフォなりミューテックスなりで待たせるのが
一般的。
329:デフォルトの名無しさん
08/01/06 23:47:25
>>327
pthread_barrier_wait()
とエスパー。
330:デフォルトの名無しさん
08/01/07 02:21:07
>>327
C言語にスレッドという概念はない。
環境書かないとわかんないよ。
331:デフォルトの名無しさん
08/01/07 09:38:37
WindowsXPです。
332:デフォルトの名無しさん
08/01/07 10:22:58
>>331
Winなら、MFC使ってUIスレッド作って、メッセージで動かすのが簡単だが。
Win32APIだけでやりたかったら、↓のマルチスレッドの章を一通り読んでみ。87章から。
URLリンク(www.kumei.ne.jp)
WaitForSingleObject() あたりを使うことになるだろうな。89章から先に載ってる。
333:デフォルトの名無しさん
08/01/07 11:51:27
レスありがとうございます。
調べましたところ、
WaitForSingleObjectはスレッドがシグナル状態になるまで待ち合わせを行うものだとありましたが、
これをどのように使えばスレッドを途中停止出来るのでしょうか?
334:デフォルトの名無しさん
08/01/07 11:55:26
>>333
スレッドで考えるんじゃなくて二人以上の作業者による連携プレーを考えろ
で、ひんとはミューテックスオブジェクトかセマフォオブジェクト
335:デフォルトの名無しさん
08/01/07 13:15:18
スレッドを止めたいって書いてあるのが読めないのか?
答えられないならレスするんじゃねぇよ。
336:デフォルトの名無しさん
08/01/07 13:25:13
>>335 をつつくとSuspendThread使えとか言い出しそうだな(笑
337:デフォルトの名無しさん
08/01/07 13:30:41
「いい方法はありません」ってことで。
338:デフォルトの名無しさん
08/01/07 15:08:45
>WaitForSingleObjectはスレッドがシグナル状態になるまで待ち合わせを行うものだとありましたが、
調べが足りてないね。
339:デフォルトの名無しさん
08/01/07 15:13:49
Windowsなんて使ってるやつは馬鹿です
340:デフォルトの名無しさん
08/01/07 15:21:29
>>339
なぜですか?
341:デフォルトの名無しさん
08/01/07 19:32:15
「ATOK使うやつは馬鹿」と何かの関係が!?
342:デフォルトの名無しさん
08/01/07 19:33:09
ここは良心的な釣堀か。入れ食いだな。
343:デフォルトの名無しさん
08/01/07 19:44:14
なぜ止めたいかを説明してケロ。
他のスレッドを強制的に止めたいのか、何かを待ちたいのか。
スレッドを止める方法はいろいろあるので、目的を説明して。
344:デフォルトの名無しさん
08/01/08 03:46:58
個人中傷スレだったので・・・
345:デフォルトの名無しさん
08/01/12 13:01:16
スレッドじゃないけど
fork()類って実行間隔って
あまりにも短いとダメなのかな?
346:デフォルトの名無しさん
08/01/12 14:11:33
>>345
なんで?
347:デフォルトの名無しさん
08/01/12 14:21:25
>>30msに一度呼ぶと
失敗するような気がするw
348:デフォルトの名無しさん
08/01/12 14:27:36
>>347
それシステム資源食い潰してるしwww
349:デフォルトの名無しさん
08/01/12 14:28:09
そもそもなんでそんなにfork()しなきゃならんのかと。
設計から見直せ。
350:デフォルトの名無しさん
08/01/12 14:31:43
>>349
fork()する回数は10回なのですが
なるべく速くfork()を10回完了させたいだけですw
351:デフォルトの名無しさん
08/01/12 14:33:43
OSくらいさらせや
352:デフォルトの名無しさん
08/01/12 14:34:37
>>350
exec
353:デフォルトの名無しさん
08/01/12 14:43:39
ちなみにSolaris 10 で
のことです
354:デフォルトの名無しさん
08/01/12 17:20:58
errno は?
355:デフォルトの名無しさん
08/01/12 17:30:49
ダメって何がダメだったのか・・・
356:デフォルトの名無しさん
08/01/12 22:41:41
>>350
preforkしろ
357:デフォルトの名無しさん
08/01/13 08:22:40
アセンブリでマルチスレッド
これ最速
358:デフォルトの名無しさん
08/01/13 13:26:49
同期とかも全部asmでやるの?
359:デフォルトの名無しさん
08/01/13 19:16:03
spin lock
360:デフォルトの名無しさん
08/01/13 20:38:31
>>359
fairnessの問題はどうする?
361:デフォルトの名無しさん
08/01/14 13:48:04
fairlock
362:デフォルトの名無しさん
08/01/14 18:00:45
【OS】Windows Vista Ultimate
【言語】C++
【実行環境】Visual C++ 2005 Professional, C++ Boost Library 1.34.1
【その他突起する事項】なし
bool shouldExit_;
istream &is;
void handler()
{
while(!shouldExit_)
{
string str;
is >> str;
}
}
handler関数がthreadのコールバック関数になるのですが
この関数を終了させようとしてshouldExit_にtrueを代入しても
入力が内場合、入力演算子を使用しているところでずっと待機してしまいます。
このスレッドを安全に終了させる方法はないでしょうか?
363:デフォルトの名無しさん
08/01/14 18:06:54
>>362
volatile bool shouldExit_=false;
364:306
08/01/14 18:08:38
すみません。
漏れていました。
本来のコードには書いてあるのですが、shouldExit_を評価するところまで処理を持って行けません・・・。
365:デフォルトの名無しさん
08/01/14 18:09:13
>>363
をいをい w
is>>str; でブロックされてるんだからこの場合フラグは関係ないだろ。
とりあえず入力をタイムアウト付きでやるか(C++でどうやるかは知らん)、
可能なら入力ストリームをクローズしてしまえ。
366:デフォルトの名無しさん
08/01/14 18:51:35
入力を待つけどキャンセルとか強制終了出来るようにしたいんだろ?
367:361
08/01/14 19:55:45
>>365
istreamの実態はネットワークなので
まさにその方法でうまくいきました。
ありがとうございます。
>>366
もしそれができればそうしたいです。
なるべくstreamに影響を与えたくないです。
368:デフォルトの名無しさん
08/01/14 22:15:59
【OS】 linux fedora 7
【言語】 C
【実行環境】 えー?何て書けばいいのかな?
【その他突起する事項】 特になし
質問ですが、何故pthread_createの第4引数はvoidでキャストするの?
argを入れるんだし。たとえば、整数 2を入れる場合も
(void *)2
みたいに渡しますよね。
構造体に渡すと言ってもポインタで渡したら良いだけのような....
そのまま入れたらダメな理由は何ですか?
教えてえろい人
369:デフォルトの名無しさん
08/01/14 22:29:32
なにをやろうとしているかを理解してからやれ、ということ
370:デフォルトの名無しさん
08/01/14 22:31:38
そういう関数作って
そのままいれてみろ
371:デフォルトの名無しさん
08/01/14 22:32:38
>>368
日本語でおkだよ
372:デフォルトの名無しさん
08/01/14 22:34:33
>>368
32bitで済むなら、キャストして無理やり渡したほうが楽ジャン
373:デフォルトの名無しさん
08/01/14 22:35:30
>>369-370
あ、ありがとう。
理解が足りないかもですね。
(int *)でも良いんじゃないですか?って思うんです。
やってみたけど、ダメだよー
なんです。orz
374:デフォルトの名無しさん
08/01/14 22:36:23
あ、64bit環境 gccです
375:368
08/01/14 22:37:13
373,374も私です。
376:デフォルトの名無しさん
08/01/14 22:39:18
LP64環境か。なら、(void*)2ULLじゃねーの?
377:デフォルトの名無しさん
08/01/14 22:40:18
void* argを数値に戻すときは、int i = (int)(unsigned long long)arg;
378:368
08/01/14 22:47:29
>376
(void*)2
で動きます。
プリプロセッサがそのように直しているのかも知れません。
>>377
ん?
pthread_create(&th , arg2 , arg3, (void *)2);
みたいに渡しますが
pthread_create(&th , arg2 , arg3, (int *)2);
ではダメな理由は何ですか?
379:デフォルトの名無しさん
08/01/14 22:47:42
uint64_tって書けよw
380:368
08/01/14 22:50:20
uint64_tもダメでした
キチンとかかず、ごめんなさい
381:デフォルトの名無しさん
08/01/14 22:53:52
>>380
お前だめだわ
pthread_create()のmanみて
引数の定義どうなってるか調べたか?
そこは何でも受け取れるようにvoid *になってるから
そう渡せやって定義に書いてあるだろボケ
東京湾に沈めるぞドあほ
382:368
08/01/14 22:57:43
>>381
man見てますよ。
なぜvoidでキャストするの?int*とかでも良いでしょ?ポインタで渡すだけでしょ?
ってことなんです。
383:368
08/01/14 22:59:01
ポインタで渡す限りintもcharもvoidも関係ないでしょ?って質問です
384:デフォルトの名無しさん
08/01/14 23:00:55
>>382
なんでint *なの? 汎用ポインタならvoid *が判りやすくていいじゃん。
# それとも、qsort()も使ったことがない人?
385:デフォルトの名無しさん
08/01/14 23:01:29
C言語の型って何のためにあるかわかる?
386:デフォルトの名無しさん
08/01/14 23:06:28
関係ないけどC99では整数⇔ポインタ変換する場合はintptr_tを使った方がよくて、
それやらないと最悪strict aliasingの最適化でバグっちゃうケースがあるらしい。
387:368
08/01/14 23:08:43
>>384
>汎用ポインタならvoid *
大抵、そうですね。
昔、voidに型は無い、という話だったけど、void型という型になっていて浦島
状態です。
>>385
話の流れから、メモリ確保の為。
intのサイズは小さく、他に大きなサイズの時困るって事でしょうけど。
今回は、pthread_create(&th , arg2 , arg3, (int *)2);
のように、サイズが小さくても、不整合は出ないような...
出るのかな?
388:デフォルトの名無しさん
08/01/14 23:13:41
いや、Cにはvoid型はないけどvoid*型はあるの。
389:デフォルトの名無しさん
08/01/14 23:17:11
void型はあるよ。
void型へのキャストもできるし。
390:デフォルトの名無しさん
08/01/14 23:17:48
>>387
サイズ云々はかんけーねーだろ
8byteの汎用アドレス渡すことに
何一々屁理屈こねてるんだアスペル房?
391:デフォルトの名無しさん
08/01/14 23:20:22
>>368
あるよ
392:368
08/01/14 23:20:31
>>390
>385は何のため?
>>389
void型って、出来てますよね?
393:デフォルトの名無しさん
08/01/14 23:20:42
>>387
考えがアセンブラだなぁ。
ひょっとして今時オブジェクト指向を理解できてない人?
394:368
08/01/14 23:22:59
>>393
確かに gcc -Sのコード見たほうがデバッグ早いです。
オブジェクト指向は、時々する程度です
395:デフォルトの名無しさん
08/01/14 23:23:51
>>392
厳密に型が決まってる言語だから
その場合に曖昧さを表現するには
C言語の場合、簡単な解決方法は
void *で表現すること
理解できないみたいだし四ねw
396:デフォルトの名無しさん
08/01/14 23:27:08
void hoge(void) {
return (void)0;
}
規格にも void type とかいう用語は出てくる。
397:デフォルトの名無しさん
08/01/14 23:27:48
>>395
理解しますが
>簡単な解決方法void *で表現
ならば、他に方法は有るのですか?無いのですか?
398:デフォルトの名無しさん
08/01/14 23:31:34
値は同じでも意味が違うものってあるでしょ。
C言語でいうなら同じ0でも、数学の0と、ポインタのNULLでは意味が違う。
それらを区別するために型という概念がある。
で型があることでコンパイル時に型チェックが可能となって意味の混同が起こってないかを調べられるわけ。
399:デフォルトの名無しさん
08/01/14 23:35:53
引数に int* ってあるなら、それは32bitの値へのアドレスを渡すということではなくて
intの意味を持ったものへのポインタを渡すって理解すべきなの。
だからそこへとある構造体へのポインタを渡すなんてのは設計も使い方も分裂症気味におかしいわけ。
400:368
08/01/14 23:43:00
>>398,399
なるへそ。分かりました。
けど、別の疑問が、**(ポインタのポインタ)で渡したら型の意味もないような
401:デフォルトの名無しさん
08/01/14 23:45:46
どうでもいいけど、(void *)2はともかく、(int *)2はきもい
402:デフォルトの名無しさん
08/01/14 23:51:41
*が何個付こうが話は同じ
403:368
08/01/14 23:59:01
了解。
皆さんありがとうーーーーー。
関数作ってみようか考えていましたが、しなくて良いみたいですね
404:デフォルトの名無しさん
08/01/15 00:31:43
やけにスレが伸びてるなと思ったらC言語講習会かよ・・・
405:デフォルトの名無しさん
08/01/15 00:34:54
じゃ、pthread_atfork関係でもする?
406:デフォルトの名無しさん
08/01/15 00:37:40
pthread_yield()で頼む。
NPだけど。
407:デフォルトの名無しさん
08/01/15 00:44:56
なんで?
408:デフォルトの名無しさん
08/01/16 01:36:25
スレッドで thread1 thread2の2つを走らせている場合
正常狩猟、異常終了両方で2つのthread1 thread2とも同時に終了させて
再度、起動したいのですが、どのようにして終了させたら安全ですか?
pthread_cancel(),ptrhread_join,pthread_exit
409:デフォルトの名無しさん
08/01/16 02:31:14
>>408
スレッドを抜ける
410:デフォルトの名無しさん
08/01/16 04:51:33
>>409
そりゃそうだ。
cancel-join
exit-joinが良いのかな?
どうしたら良いかな?
mutexは無しです
411:デフォルトの名無しさん
08/01/16 11:27:19
thread10個起動して、全部待ちたいときはどうすればいいの?
412:デフォルトの名無しさん
08/01/16 11:33:00
forでjoin回せば。Win32なら64個までの限定だけどWaitForMultipleObjectsとかあるけど
413:デフォルトの名無しさん
08/01/16 11:37:22
>>411
pthread_barrier_wait()
414:デフォルトの名無しさん
08/01/16 21:02:03
あざーす。
415:デフォルトの名無しさん
08/01/17 00:19:01
すみません
スレッドでがんがん動く関数がるけど、この関数は起動字にも動いて処理します。
起動字はスレッド起こしてないんだけどpthread_関係が入っている関数を使っていいの?
具体的にはpthread_atporkです
416:デフォルトの名無しさん
08/01/17 00:58:36
誤時がおおおいな
417:デフォルトの名無しさん
08/01/17 01:38:20
あっとぽーくなんてマニアックな関数、何に使うんだか。
418:デフォルトの名無しさん
08/01/18 01:50:30
deadbeefと関連がありそうだな
なさそうでもあるな
419:デフォルトの名無しさん
08/01/18 22:47:59
>>413
411じゃないけど、pthread_barrier_wait() はlinuxでは無いようです。
どうようの効果を期待できる関数は何ですか?あるいは、その組み合わせは?
教えてちゃんですまそん
420:デフォルトの名無しさん
08/01/18 23:57:18
>>419
あんたの使ってるディストリビューションが古いだけ。
もっと新しいglibcを積んでるやつを使え。
421:デフォルトの名無しさん
08/01/19 00:46:44
LinuxThreadsの頃からあったと思うんだがな。。。
何使ってんだ??
422:デフォルトの名無しさん
08/01/19 00:48:06
>>419
ほんとにないなら、mutexと条件変数の組み合わせで実現できるけど、結構難しいよ。
NPTLのpthread_barrier_waitの実装を読んで、真似するのが良いと思う。
423:419
08/01/19 02:35:01
>>420,421
cg-linuxていうらしいです。manで無かったんです
かえたらダメだと思います。多分。
kernel=2.4.17?みたいなことします。
pthread.hを見て本当にないか見てみます。
>>422
そんなドキュメントあるんですか、本当になかったら探します。
424:デフォルトの名無しさん
08/01/19 06:58:09
私が小学生の頃、
日本中でノストラダムスの予言が大流行していた。
「1999年の7月に人類は滅亡する!」
という例のお騒がせ終末予言である。
大人になって社会に出て働きだして、
あくせくと忙しく日々を過ごしながら、
1999年は、
ありふれた日常の中であっさりと過ぎていった。
人類は滅ばなかった。
これからここで、
1999年に起こるかもしれなかった人類の壊滅的破局を、
誰にも知られずにこっそりと回避させた人たちがいた...
という設定で、
荒唐無稽なストーリーを描いてみたい。
無論、100%完全なフィクションである。
URLリンク(www5.diary.ne.jp)
425:デフォルトの名無しさん
08/01/20 00:09:05
>>423
URLリンク(www.google.co.jp)
とかのことね。
426:デフォルトの名無しさん
08/01/23 02:29:53
>>425
くーーー、64bitなんですーーー
探してみますーーーー
こんなサービスもあっ短だメモメモ
427:デフォルトの名無しさん
08/01/23 05:25:11
bit数関係あんの?
428:デフォルトの名無しさん
08/01/23 14:35:26
cglinuxってキャリアグレード?
429:デフォルトの名無しさん
08/01/24 00:25:00
そうだろうね。カーネルバージョン見ると MontaVista っぽい。
だとするなら、サポートしてるかどうかはもんたに聞いた方が良いね。
というか、419が欲しい機能は本当にpthread_barrier_waitで合ってるんだよね?
>>411 を素直に読むと >>412 で FA だと思うんだが。
(まあ419がちゃんとわかってて聞いてるなら余計なお世話だけど)
430:デフォルトの名無しさん
08/01/24 15:23:46
matrix * matrixをpthread_createとpthraed_joinだけで、
ぶん回してみたけど(quad core)普通にthread無しで
やるほうがはるかに早かった。
pthread_createのコストが高いのかなあ?
threadを最初に作っておいてpthraed_cond_wait待っておいてスレッドを使いまわす
方式で再実装してみる。
431:デフォルトの名無しさん
08/01/24 15:55:51
スレッド数4にしてる?
432:デフォルトの名無しさん
08/01/24 16:25:48
している/いろいろやってみだ。
4,10,,12,16,32
32だと、たまーにtopでみていると2000%とかになっていた。
それでも、遅い。
433:デフォルトの名無しさん
08/01/24 16:27:54
×みだ
○みた
あと、スレッド数8が抜けていた。
434:デフォルトの名無しさん
08/01/24 19:28:15
コアが4個なんだからそれより多くしてもほとんどメリットはないだろ
435:デフォルトの名無しさん
08/01/24 19:31:44
プロセス生成に比べるとマシってだけで、
スレッドの作成(と終了)はそれなりにコスト高いよ。
436:デフォルトの名無しさん
08/01/24 19:36:38
並列化効率とかアムダールの法則とかでググれ
437:デフォルトの名無しさん
08/01/24 23:34:00
DualCoreXeon*2で実験した限りでは、core辺り処理量は(殆ど)変わらなかったけどなぁ。
分割の仕方が悪いんで内科医?
438:デフォルトの名無しさん
08/01/25 06:20:13
>>436
そんなの、スレッド本の第一章に書いてあるだろ。
439:デフォルトの名無しさん
08/01/26 13:54:13
Windowsで
4つのスレッドを開始させ、
一つのスレッドが終了次第、
ほかのスレッドも全て終了させる方法ってありますか?
440:デフォルトの名無しさん
08/01/26 14:02:01
>>439
そのように作ればそうなります。
441:デフォルトの名無しさん
08/01/26 14:07:17
>>440
すみません。
私の聞き方が曖昧でした。
手段を教えて下さい。
442:デフォルトの名無しさん
08/01/26 14:31:08
終了すると終了させるは微妙だが大きな違い
443:デフォルトの名無しさん
08/01/26 14:37:11
>>439
4人の子供のうち、誰か一人でも死んだという通知が来たなら、他の三人に死亡要求を掛ければよろしいかと。
子供が死亡要求を聞き届けてくれない仕様ならば、殺すしかありませんが。
いずれにしても、APIレベルで実装したいならAPIスレ、.Netでやりたいなら.Netスレ、そうでないならVSスレなり
初心者スレなり適当にどうぞ。
444:デフォルトの名無しさん
08/01/26 14:41:02
WaitForMultipleObjectsで4つのスレッドを待てば、どれか一つのスレッドが
終了したかが判るから、あとは終了イベントたてるなり(スレッドが参照していることが条件だけど)、
TerminateThreadするなり(非推奨)、好きなようにやれば。
445:デフォルトの名無しさん
08/01/26 14:54:02
マルチスレッド使って、CPU負荷分担みたいなことってできる?
2つのまったく動作が同じスレッド作って、2つのCPUリソースに処理を振り分けるとか?
446:デフォルトの名無しさん
08/01/26 15:25:58
できるできないで言えば普通できるに決まっとろう。
447:デフォルトの名無しさん
08/01/26 16:19:18
なにか共通で使うリソースがあって、同時にそれを使えない場合は、
如何に競合を回避するか考えないと、相手のリソース解放を待つのとかで、
同時に動作できる時間が減っちゃう。
CPU1: *-*-* ***---
CPU2: -*-*- とか ---***
こんなのになったら意味無いし。
448:デフォルトの名無しさん
08/01/26 18:09:47
無駄だけどセマフォしかないわ、全部持つか、一個なら諦めろw
449:デフォルトの名無しさん
08/01/26 21:55:22
Windowsでは、有限バッファ問題(生産者消費者問題)はどう解決するのが良いでしょうか?
URLリンク(www.cs.is.noda.tus.ac.jp)
生産者も消費者も単一プロセス内のスレッドで、生産者・消費者はそれぞれ複数いるという
状況です。バッファがfullまたはemptyのときは、pushまたはpopの処理がブロックしてかま
いませんが、バッファ長は1や2ではなくもう少し大きくしたいと思っています。
UNIXだと、条件変数かセマフォを使えば簡単に実装できると思いますが、前者はWindowsには
無く、後者は単一プロセス内の同期として用いるのは効率が悪そうです。
Windowsは、VistaではなくXPを使っています。よろしくおねがいします。
450:デフォルトの名無しさん
08/01/26 23:22:41
何でもマルチスレッドにしたがるバカw
451:デフォルトの名無しさん
08/01/26 23:32:11
>>449
XPには条件変数は無いから。自分で作る。
452:デフォルトの名無しさん
08/01/27 00:24:29
条件変数って何があれば自作できるんだっけ?
453:デフォルトの名無しさん
08/01/27 00:30:14
Mutex/CriticalSectionとEventと変数でいいんじゃねーの?
454:デフォルトの名無しさん
08/01/27 00:40:01
>>453
おそらくその組み合わせでは条件変数もどきは作れないと思うのだが・・。
でも、もし大丈夫だとされている実装とか、MS推奨の実装を知っていたら教えて。
455:デフォルトの名無しさん
08/01/27 01:00:10
できないと思う理由を書いてくれ。
なんか、条件変数に過大な期待をしてるみたいだから。
456:デフォルトの名無しさん
08/01/27 01:10:01
broadcast考えなきゃ、Auto Reset Eventを
SignalObjectAndWaitで待てば済む話じゃね?
457:デフォルトの名無しさん
08/01/27 01:23:45
>>455
Mutexの開放とEvent待ちをアトミックに行うことができないから。
たとえばここ URLリンク(docs.sun.com)
の一番下にあるようなコードの、pthread_mutexをCriticalSectionに置き換えて、
pthread_condを自動リセットのEventに置き換えたとすると、
バッファが空の状態で、スレッドAがデータを取り出そうとする
Event待ちの寸前でコンテキストスイッチ
まだバッファが空の状態で、スレッドBがデータを取り出そうとする
Event待ちの寸前でコンテキストスイッチ
スレッドCがデータを投入
スレッドCがSetEvent
スレッドCが再度データを投入
スレッドCがSetEvent
スレッドAがイベント待ちに入り、すぐ戻る
スレッドAがデータ取り出し完了
スレッドBがイベント待ちに入る。データがあるのにイベント待ちから戻れない
となる恐れがない? (CSのEnter/Leaveは省きました)
URLリンク(www.linux.or.jp) の、
> 条件変数はいつでも mutex と結びつけられていなければならない。これは、あるスレッドが条件変数を
> 待とうとしている時に、他のスレッドが、先のスレッドが実際に条件変数に対して待機するその直前に
> 条件を送信する、という競合条件を避けるためである。
を参考にしました。
458:デフォルトの名無しさん
08/01/27 01:30:15
というわけで、producer-consumerのうまいコード例があればお願いします。
459:デフォルトの名無しさん
08/01/27 01:31:34
投入データの個数をセマフォで管理しとけばいいんじゃないかな
データ投入後→セマフォを1上げる
データ取り出し前→セマフォを1下げる(データがない=セマフォが0の場合は投入される=1以上になるまでブロック)
460:デフォルトの名無しさん
08/01/27 01:35:29
>Mutexの開放とEvent待ちをアトミックに行うことができないから。
はいはい。SignalObjectAndWait, SignalObjectAndWait。
461:デフォルトの名無しさん
08/01/27 01:39:35
>>460
んー、この用途に使えるのか。サンクス。調べてみます。
>>459
最悪それでいこうとおもってます。けど460のでいけるならそれがベター。
462:デフォルトの名無しさん
08/01/27 01:40:44
というか、Producer-Consumerなら、スレッドプールつかって
あとは知らぬの半兵衛を決め込めばいいような気がしてきたぞ。
Producer() {
{
CriticalSectionLock csl(cs);
return if list.full?
list.push( somethings )
QueueUserWorkItem( Consumer );
}
}
Consumer(){
{ CriticalSectionLock csl(cs);
workitem = pop();
QueueUserWorkItem(Producer);
}
SomeWork;
}
463:デフォルトの名無しさん
08/01/27 01:41:59
>>462
そういうのもあるんですか。そっちも調べてみます。
ありがと。
464:デフォルトの名無しさん
08/01/27 01:57:33
>>456
ブロードキャストしたい場合は
465:デフォルトの名無しさん
08/01/27 02:08:57
その場合は、根本から考え直しだよね。
APRみたいに、Manual Rese Eventを待つたびに、待ちスレッド変数をインクリメントして
起こされるとデクリメント。自分が最後に起こされたスレッドかどうかを判断して、
ResetEvent発行するとかさ。
466:デフォルトの名無しさん
08/01/27 02:11:42
manual resetにするわけか。めんどくさいね。
467:デフォルトの名無しさん
08/01/27 14:51:01
結論:Windowsはクソ
468:デフォルトの名無しさん
08/01/27 15:00:27
条件変数を作るとして、それに使うWindowsの同期オブジェクトはどれが軽くてお勧めか?
469:デフォルトの名無しさん
08/01/27 15:18:26
CriticalSectionにSignalObjectAndWaitできるの?
470:デフォルトの名無しさん
08/01/27 15:18:47
>>468
Vistaを使う
471:デフォルトの名無しさん
08/01/27 16:59:39
>>435
thread pool化した。8thread上げといてそれを、
pthread_cond_wait/signal/broadcast
pthreaf_mutex_lock/unlock
で、ぶん回した。
non thread時の倍ほどがのスピードが、漸くでた。
単純にctreate/joinだけだと、メチャメチャコストが高いのですね。
このときは、non thraed時の8倍ほど時間がかかった。
472:デフォルトの名無しさん
08/01/27 18:19:52
>>468-469
CSが使えないんだとしたらエラく遅くなるよな。
実際のところどうなのか教えてエロい人。
473:472
08/01/27 18:24:54
URLリンク(www.cs.wustl.edu) の3章に実装例があった。
どれも大変な事になっているな。たぶん、pthread_cond_broadcast()を実現しようとしているからだと思うが。
474:デフォルトの名無しさん
08/01/27 20:08:28
VS2005、C++でWin32ウィンドウプログラムを作成しています。
キューの中身が空の間、スレッドを待機させたいのですが、while(que.empty())
{
Sleep(0);
}
とすると、CPUはぶんまわされるわ、スレッド終了フラグも受け取れないわで困っています。
キューにデータが入った瞬間にスレッドが回りはじめ、かつ終了フラグも受け取るためにはどうすればよいのでしょうか?
初歩的な質問ですみませんがよろしくお願いします。
475:デフォルトの名無しさん
08/01/27 20:29:07
釣り?
476:デフォルトの名無しさん
08/01/27 22:12:47
いえ、釣りではないのですが…
もう少し調べてみます。
それでも分からなければ初心者スレに行きます。
スレ汚し失礼しました
477:デフォルトの名無しさん
08/01/27 22:51:27
とりあえず、セマフォを使ってみよう。
478:デフォルトの名無しさん
08/01/27 22:54:49
というか、今までの話題がまさにそのProducer/Consumerパターンについてなわけだが
479:デフォルトの名無しさん
08/01/28 00:08:21
>>449-
.NETならこれ
URLリンク(msdn.microsoft.com)
Vistaならこの記事がおすすめ。
URLリンク(msdn.microsoft.com)
480:デフォルトの名無しさん
08/01/28 00:09:22
>>479
C++でXPなんです・・
481:デフォルトの名無しさん
08/01/28 01:08:54
つうか、セマフォ使えや、カス
482:デフォルトの名無しさん
08/01/28 01:20:54
メータードセクションだろ普通
483:デフォルトの名無しさん
08/01/28 01:21:26
>>481
誰にいってんの?
484:デフォルトの名無しさん
08/01/28 01:23:40
>>482
へぇ。そんなのあるんだ。プロセス間でも使えて、一定回数はカーネルに落ちないでspin?
485:デフォルトの名無しさん
08/01/28 02:31:00
全部ホシュするなら、全部ヤッパ明渡せヤゴラ、でOK
486:デフォルトの名無しさん
08/01/28 07:52:58
?
487:デフォルトの名無しさん
08/01/28 09:51:29
VMwareでLinux上げてpthread使えば解決
488:デフォルトの名無しさん
08/01/28 10:42:06
queueに要素があるかは、>>477,>>481の通りセマフォでやればいいんじゃない?
増減するリソースを管理するんだからちょうどいいでしょ。
フラグの変更はイベントにでもして一緒に待つか、queueに終了って言うなにかを投げ込めば?
489:デフォルトの名無しさん
08/01/28 18:01:56
Linux野郎なんでWindowsには全く疎い俺参上!
Windowsの独自スレッドだけでpthreadはないの?
あと、pthreadとWindowsスレッドを比較した利点・欠点
がまとめてあるHPとないでしょうか?
490:デフォルトの名無しさん
08/01/28 20:46:19
>>484
スピンで待たせるなら、プロセス内専用だけどWindowにもInitializeCriticalSectionAndSpinCountなんてものもあるよ。
491:デフォルトの名無しさん
08/01/28 22:07:07
メータードセクションは、Windowsの話だけど・・・
492:デフォルトの名無しさん
08/01/29 06:27:19
CriticalSectionがspinなのはわかってるよ
493:デフォルトの名無しさん
08/01/29 06:34:26
>>489
Linuxにも疎そうだな
494:デフォルトの名無しさん
08/01/29 09:57:59
どうしてもpthreadがいいなら、pthreads for Win32があるでしょ。
以前mingwでつかってたよ。VCでも使えたはず。
495:デフォルトの名無しさん
08/01/29 12:58:59
下のようなクラスを作って、Monitorでのロックと比較してみた。
EnterWithContextSwitchで、ロックがほとんどかち合わないで誤差の範囲で軽く、ロックが頻繁な場合だと
明らかに遅くなる。Enterは確実に遅い。
class SpinLock {
volatile int _isEntered;
public void Enter() { while (Interlocked.CompareExchange(ref _isEntered, 1, 0) != 0) { }}
public void EnterWithContextSwitch() {while (Interlocked.CompareExchange(ref _isEntered, 1, 0) != 0) {Thread.Sleep(0);}}
public void Exit() {_isEntered = 0;}
}
//試したのはこんな感じ 各スレッドで
for (int i = 0; i < _loopCount; i++) {
thp.LockDeleg(thp);//ここでLockして
DoWork(_jobTime);//ここで指定時間処理して
thp.UnLockDeleg(thp);//ここでUnlock
}
対象のロックはmontor,SpinLockともども複数生成して、ロックするときにランダムでロック対象を決めるようにした。生成するロック数も多い場合、少ない場合色々試してみた。
環境はXP Sp2 C# .NET2.0 DualCoreのアスロン何たら。
テスト中はCPUを使い切る場合もあれば各CPUが70%ぐらいで推移する場合もあり。どちらのロックでそうなるかは不明。多分SpinLock。
参考URL
URLリンク(msdn.microsoft.com)
何か間違ってる?ついでにおまいらのマルチスレッドに関する考え方、使い方を教えてくれ。
教えてエロイ人
496:デフォルトの名無しさん
08/01/29 18:13:34
何がしたいのこれ?
497:デフォルトの名無しさん
08/01/29 18:26:19
.netのモニターオブジェクトと自前スピンロックの性能評価?
498:デフォルトの名無しさん
08/01/29 18:42:28
具体的に何を計りたいのかよくわからん。
ついでについては、ロックがかち合う可能性を下げるように設計する。
499:495
08/01/29 18:54:29
違う回線よりすいません。
説明不足で申し訳ないです。
言われるとおり、自作スピンロックでどれだけロックが軽くなるかの調査です。
いくつかの記事で、SpinLockでのcpu消費の方が、コンテキスとスイッチより軽いと言っていたので試してみました。
結果が記事と逆になってしまったので自分のコードが何かおかしかったのかと。
500:デフォルトの名無しさん
08/01/29 19:10:11
スピンロックはマルチプロセッサじゃないと効果無いんじゃないか?
スピンしてる間にロックが外れれば、カーネルに落ちなくて済むじゃん
501:デフォルトの名無しさん
08/01/29 19:27:06
>環境はXP Sp2 C# .NET2.0 DualCoreのアスロン何たら。
って書いてあるから、2つあるんでそ。
502:デフォルトの名無しさん
08/01/29 19:31:05
あ、ほんとだ。失敬失敬。
503:デフォルトの名無しさん
08/01/29 19:33:43
単純なサンプルで重い、軽い、と早い、遅いを同列に語っても意味無いかと。
あとSleep(0)の分解能なんてろくに無いんだから
いちいちロックされてるたびに呼んでたら無駄に待たされる。
ただ、一般的には、他の誰かが処理してるからCPU時間を明け渡してあげることで
いち早くロックを取得できる可能性をあげる意味でSleepを使う
Sleep(0)の分解能調べて見て、中のジョブがどれぐらい時間かかってるか
調べて見れば、あなたのいう軽いとか遅いとかがより深く理解できると思う。
Win32だったらCriticalSectionで一発だったんだが
.netはLockかInterlockしか無いのかな
504:デフォルトの名無しさん
08/01/29 19:33:52
public void EnterWithContextSwitch() {while (Interlocked.CompareExchange(ref _isEntered, 1, 0) != 0) {Thread.Sleep(0);}}
というか、これ "Sleep(0)" が原因でねーの。他にするタスクがないとき、CPU休まないじゃん。
505:デフォルトの名無しさん
08/01/29 21:06:30
.NETのロックは元々クリティカルセクションだよ。
506:デフォルトの名無しさん
08/01/29 21:15:59
単純なスピンロックなんざそもそも間の処理が極めて短時間で
競合なんてまず滅多に起こらん場合にしか向かん。
507:デフォルトの名無しさん
08/01/29 21:27:30
どうもインタロック操作が極端に軽いと勘違いしてる奴や記事が多いな。
.NETなんて単純にロックでもそう大差はないのに。
508:デフォルトの名無しさん
08/01/29 21:39:37
ああこれは件のMSDNの記事の事じゃないので念のため。
509:495
08/01/29 21:59:01
>>506
そのようだ。
>>507
極端に軽いと勘違いしてた。
今は反省している
510:デフォルトの名無しさん
08/01/30 13:04:30
>>21によれば、.netの機能をそのまま使えば良いんじゃないか?
511:デフォルトの名無しさん
08/01/30 19:09:40
うんそう。
あえてスピンロックにするのはインタロック操作1回分までも節約したいとき。
2回→1回
512:デフォルトの名無しさん
08/02/03 11:08:05
環境visualstudio2005 vc++
_beginthreadexを使ってメインを合わせて合計3個と100ms毎の割り込みをさせてるんですが、
assert(0)が有効にならない場合があります。マルチスレッドで緊急にプログラムを停止させたい場合は
どうすればいいんでしょうか?
513:デフォルトの名無しさん
08/02/03 11:18:51
ExitProcess
514:デフォルトの名無しさん
08/02/03 11:33:51
>>512
WaitoForSingleObjectとSetEventを使う。
515:デフォルトの名無しさん
08/02/03 12:06:49
assert(0)
516:デフォルトの名無しさん
08/02/03 17:58:20
>>514
Waito ?
517:デフォルトの名無しさん
08/02/03 18:28:11
WaitoSinguruObujecuto と SinguruIvento
518:SettoIvento ならわかるが...
08/02/03 21:12:20
SinguruIvento ?
519:514
08/02/03 21:19:11
ゆるしてっ!!
520:デフォルトの名無しさん
08/02/04 19:47:15
>>512
俺を使え。全力でとめてやるぜ
521:デフォルトの名無しさん
08/02/08 14:49:26
生成したスレッドから、
ウィンドウハンドルを使用するマクロを使うためにはどうすればいいですかね?
522:デフォルトの名無しさん
08/02/08 14:54:37
わかりやすい日本語でお願いします。
523:デフォルトの名無しさん
08/02/08 18:17:55
>>521
ウインドウハンドルが欲しいのかな?
524:デフォルトの名無しさん
08/02/11 23:34:04
Visual Studio.NET 2003で、Win32API、C++のプログラムをしてるんですが、
複数スレッド同時に、クラスのオブジェクトをnewしまくると、
・HEAP[aaa.exe]: HEAP: Free Heap block 3c04d0 modified at 3c04e0 after it was freed
・0xC0000005: 場所 0xfeeefeee に書き込み中にアクセス違反が発生しました。 。
・0xC0000005: 場所 0xfeeefeee を読み込み中にアクセス違反が発生しました。 。
などのエラーがでます。
何か回避方法はないでしょうか?
newしてるのは同じクラスのオブジェクトですが、
static変数は持っておらず、グローバル変数も共用してません。
共用のものとしてはstatic関数を持ってますが、使ってはいません。
525:デフォルトの名無しさん
08/02/12 00:22:37
> 何か回避方法はないでしょうか?
バグを直す。
526:デフォルトの名無しさん
08/02/12 00:41:03
ランタイムがシングルスレッド用になってんじゃね?
527:524
08/02/12 00:58:26
>>525
シンプルな以下のクラスでテストしてみたんですが、
やっぱり同じエラーが出ます。
class TestClass{
public:
TestClass();
virtual ~TestClass();
};
TestClass::TestClass(){}
TestClass::~TestClass(){}
>>526
ランタイムってなんでしょうか?
VCで設定するものですか?それとも実行する環境に依存するもの?
528:デフォルトの名無しさん
08/02/12 01:01:02
クラスの定義よりも寧ろ、「newしまくる」方を晒せよ。
529:524
08/02/12 01:06:18
>>526
ありがとうございます!
VCの設定で、
プロジェクトのプロパティ→C/C++→ランタイムライブラリを、
マルチスレッドデバッグにしたらエラーが出なくなりました。
530:デフォルトの名無しさん
08/02/12 01:11:48
ヤレヤレ
531:デフォルトの名無しさん
08/02/12 12:34:51
>>529
シングルスレッド用でコンパイルが通ったてことはCreatThreadを使ってるのかな?_beginthreadExを使ったほうがいいよ。
532:524
08/02/13 02:11:46
>>531
_beginthreadExは知りませんでした。
調べてみます。ありがとう。
533:デフォルトの名無しさん
08/02/13 10:20:00
グローバル変数使う標準Cライブラリ(strtokとか)を使う場合、_beginthreadExじゃないとまずいことになる。
そうじゃないならCreateThreadでも特に問題なかったと思う。
534:デフォルトの名無しさん
08/02/13 23:11:17
>>533
mallocやnewとか、VCランタイムのいろんなものがやばい。
コンパイラベンダでも無い限り、CreateThread使う必要なし。
535:デフォルトの名無しさん
08/02/14 00:54:08
マルチプロセッサ環境でストアバッファのデータを反映させたい場合
pthreadだとmutex使えばいいんでしょうか?
536:デフォルトの名無しさん
08/02/14 01:38:26
>>535
同期プリミティブの使用でフラッシュしてくれなかったら、どうにもならない。
537:デフォルトの名無しさん
08/02/14 02:08:24
>>535
んー、volatileかな。
538:デフォルトの名無しさん
08/02/14 13:03:57
メモリバリア
539:535
08/02/14 23:26:30
恥のかきついでに。。。
フラッシュされるということはmutexのアンロック後に
他のスレッドから同期プリミティブを使用せずにメモリを参照しても
mutexがアンロックされた時点までの操作は完了してると見なしていい
この解釈は合ってるのかな
540:デフォルトの名無しさん
08/02/15 01:55:14
posixがそれを要求してる、って
URLリンク(d.hatena.ne.jp)
ここらへんに書いてあった。
541:535
08/02/15 02:19:14
なるほど。
URLリンク(www.opengroup.org)
ここにある関数を呼び出した時点でメモリが同期されるわけですね
ありがとうございました
542:デフォルトの名無しさん
08/02/15 11:02:56
>>539
mutexのアンロックで書き込み側プロセッサのキャッシュがメモリと同期されても、
それだけでは読み込み側プロセッサのキャッシュはメモリと同期されないのでは?
読み込み側にも同期プリミティブ(具体的にはmutexのロック)が必要なはず
543:535
08/02/16 15:34:51
>>540の"同時アクセスさえ防いでおけばすべてうまく行く"
というのを信用したんですが・・・どっちが正しい?
544:デフォルトの名無しさん
08/02/16 16:21:03
キャッシュと同期オブジェクトは別じゃないのか。
545:デフォルトの名無しさん
08/02/16 16:21:28
同時アクセスを防ぐ=読み側もmutexなりでロックしにいく
でも読み込みだけならロックいらないよね。volatile最強!
546:デフォルトの名無しさん
08/02/16 16:39:51
>>545
一応マジレスしておくと、volatileでは確実に読めることが保証されない。安全を期するならロックした方が楽。
# 理由については割愛。
547:デフォルトの名無しさん
08/02/16 17:41:24
CPUのマニュアル読むのが一番
548:デフォルトの名無しさん
08/02/16 17:42:24
>>543
読み込み側もmutexをロックしないと、同時アクセスを防げないじゃないか。
まだ書き込み側がmutexをアンロックする前かもしれないのに。
549:デフォルトの名無しさん
08/02/17 15:13:07
pthreadの、pthread_join()とsleep()の関係について質問します。
主系スレッドZにて、子スレッドa, b, cをpthread_create()により作成します。子スレッドa, b, cは一定時間経過後に処理を行います。一定時間経過するのを待機する場合、sleep()を使っています。
主系スレッドZでは、子スレッドa, b, cが終了するのを待つために、pthread_join()を使っています。しかし、子スレッドa, b, cがsleep()で待機しているときを、子スレッドが終了した時と勘違いしているようです。
現在では、子スレッドa, b, cが終了する前に、それぞれが主系スレッドZにsignalを送るようにしています。主系スレッドZでは、signalが来るまで待機としています。
最初にやっていた、pthread_join(), sleep()の組合せの方がスマートだと思うのですが、こちらの方法でうまくやるのは無理なのでしょうか?
550:549【言語】【実行環境】【その他突起する事項】
08/02/17 15:18:17
環境を書き忘れていました。
【OS】debian/etch
【言語】C(pthread/posix)
【実行環境】
glibc2.3.6
gcc4.1.2
kernel 2.6.18-6-486
libpthread NPTL2.3.6
551:デフォルトの名無しさん
08/02/17 15:21:59
突起フイタ
552:デフォルトの名無しさん
08/02/17 15:50:00
>主系スレッドZでは、子スレッドa, b, cが終了するのを待つために、
>pthread_join()を使っています。しかし、子スレッドa, b, cがsleep()で待機しているときを、子スレッドが終了した時と勘違いしているようです。
コード晒してみてくれ
553:549
08/02/17 16:23:25
どうやら勘違いだったようです。
真の原因は、Zでログファイル用に
fp_glb=fopen("Z.log","w");
として、fpを持っているのですが、子スレッドが、
fprintf(fp_glb, "log write thread name [a]\n");
として、共通のログファイルに書き込みを行おうすると、死んでいるようでした。子スレッドでは、書き込む前に排他ロックを行っているのですが、主系スレッドでは行っていないことが原因だと思っています。
554:デフォルトの名無しさん
08/02/17 16:24:12
無茶苦茶だな。
555:デフォルトの名無しさん
08/02/19 09:12:29
VC++にpthreadはないのでしょうか?
556:デフォルトの名無しさん
08/02/19 11:47:28
>>555
>>494
557:デフォルトの名無しさん
08/02/20 19:33:15
自分から終了することもあるし、外部から終了通知を受け取ることもある
ようなスレッド関数について質問です。
こういう場合、(スレッド関数はすでに終了してるぞ!)フラグや
(外部から終了通知が出されたぞ!)的な何かはいったいどうやって実装していますか?
自分はいつも
bool isActive = false;
bool IsThreadActive() { lock {return isActive} }
void SetThreadActive(bool flag) { lock {isActive = flag; } }
void ThreadFunc() {
SetThreadActive(true);
try {
while (IsThreadActive()) {
... いろんな処理
}
} catch(...) {
SetThreadActive(false);
throw;
}
}
的なやり方でやってしまっているのですが、
これって正しいのでしょうか?
また、もしあればもっといい方法を教えていただけると助かります。
558:557
08/02/20 19:36:19
書き忘れました
while (IsThreadActive()) {
... いろんな処理
}
の内部から breakで抜けることもあります。
(SetThreadActive(false)も付け足してください)
559:デフォルトの名無しさん
08/02/20 19:41:56
終了要求フラグとすでに終了してるぞフラグは別にした方がいいんじゃないかな
すでに終了してるぞフラグが要るかどうか(何に使うのか)にもよるような
560:デフォルトの名無しさん
08/02/20 20:03:24
スレッドでいくつかの処理を行いたいのですが、
その処理の内容が
1、実はまったくスレッドが必要にならない場合がある
2、処理の行われる間隔が長いので、
続く処理が無いようならとりあえずスレッドを終了させたい
というもので、ある処理のリクエストが入ったとき、
*スレッドが稼動していればそのままリクエストを追加
*稼動していなければ新たにスレッドを起動して処理を開始
*終了要求が入ったらすべてのリクエストを破棄&スレッドを終了
ということがしたいのです。
561:デフォルトの名無しさん
08/02/20 20:13:33
スレッドを終了する要因がメイン側からの要求だけなら、
スレッドが生きてるかどうかはメイン側が完全に把握してるはずなので、
子スレッド側から「すでに終了してるぞ」フラグを操作する必要はないはず
562:デフォルトの名無しさん
08/02/20 20:23:14
>>561
スレッドを終了させる要因には、メイン側からの通知もそうですが、
子スレッド内での例外や、自殺も含まれます。
結局、これはフラグで操作するしかないのでしょうか?
というのも、「スレッドをフラグで操るなんて危なすぎ」みたいな話を聞いたことがあるので・・・
それにconditionとか、なんとなくかっちょいい機能を使いたいような気もします
563:デフォルトの名無しさん
08/02/20 20:30:57
>>561
すいません。分かりにくかったですね。これも追加してください
*リクエストが無ければ、とりあえずスレッドを終了(再びリクエストが来たら再度起動)
564:デフォルトの名無しさん
08/02/20 20:55:19
例外で死ぬなら、残ったリクエストを誰かが引き継がなきゃいけないような・・・
キャッチできるなら再開して残りのリクエストを処理する方がいいんじゃないかな
リクエストキューとスレッド生存フラグは単一のロックで操作しないとまずいことになると思う
終了要求フラグは別のロックでも構わないけど、一緒にしとくのが無難かと
親側
lock {
リクエスト投入
if (スレッド生存==false) { 子スレッド起動; スレッド生存=true }
}
子側
loop {
lock {
if (終了要求) { スレッド生存=false; return }
リクエスト取り出し
if (もうリクエストないよ) { スレッド生存=false; return }
}
try { リクエスト処理 } catch { エラーメッセージを吐くとか }
}
たぶんこんな感じ?
565:デフォルトの名無しさん
08/02/20 20:57:14
終了してるかどうかはそのためのもの(WinならWaitForSingleObjectとか)で調べるでしょう。
566:デフォルトの名無しさん
08/02/20 21:08:10
>>565
スレッドが例外とかで突然死した場合はメイン側でWaitFor~なりで捕まえて再起動するしかないけど、
リクエスト投入時の新スレッド起動判断をそれでやると、
その直前にリクエストがキューにないと判断したため自発的に終了しつつあるスレッドと入れ違いになる可能性が・・
567:デフォルトの名無しさん
08/02/20 21:25:45
>>564
おお、なるほど。そういう風にやればいいんですね。
>>557だと、「いろいろな処理」中にisActiveがfalse、
かつリクエスト追加でフラグがtrueになるとスレッド二つになりますし、
タイミング的にスレッド消える危険もありますね。
それをテンプレにしていろいろ試してみたいと思います。
ありがとうございました。
568:デフォルトの名無しさん
08/02/20 22:14:25
俺ならこんな構造にする。
・リクエストを出すスレッドはイベントループを持つ。
・作業スレッドはリクエストキューと終了要求フラグを見ながら愚直に仕事をする。
・作業スレッドが処理を1つ済ませたり終了したりしたら、
1回だけ呼ばれるコールバックを要求元スレッドのイベントループに登録する。
・コールバックは要求元スレッドで走り、処理結果やエラーを通知する。
問題は、イベント待ちで寝ているときに目を覚まさせる方法が
既成のイベントループに必ずしも用意されていないこと。
569:デフォルトの名無しさん
08/02/21 09:40:13
毒を投げればいいだろ
570:デフォルトの名無しさん
08/02/21 09:48:43
基本的にスレッドはブロッキング操作があるようなものを非同期で行わせるために俺は使ってるから,
イベントループとか使えないんだよね
571:デフォルトの名無しさん
08/02/21 12:56:56
一方、漏れは匙を投げた。
572:デフォルトの名無しさん
08/02/21 19:03:51
double pi=3.14159265358979823846;
if((fp=fopen("PI.bin","wb"))==NULL)
printf("\aファイルをオープンできません。\n");
else{
fwrite(&pi,sizeof(double),1,fp);
fclose(fp);
}
C言語で↑のようにpiをバイナリファイルに書き込んで、
BZというバイナリエディタで開いたのですが”$-DT・ @”(文字部)と表示されました。
その後にfread関数でPI.binの内容をプログラム上で出力すると3.1415926……とさきほどの数字に限りなく近い数字できちんと表示されたのですが
バイナリエディタで見ると変な文字に変わってしまうのは、何が原因なのでしょうか?これをバイナリファイルとして正しく見れる方法はあるのでしょうか。
573:デフォルトの名無しさん
08/02/21 19:04:04
ブルータス!お前もか!
574:デフォルトの名無しさん
08/02/21 19:07:45
>>572
スレタイと何か関係あった?
575:デフォルトの名無しさん
08/02/21 19:10:06
>>574
完全に誤爆です
すいませんでしt
576:デフォルトの名無しさん
08/02/26 01:43:14
>>572
原因はお前の頭が悪いこと。
そもそもスレ違い。
577:デフォルトの名無しさん
08/02/26 04:30:54
5日も前に誤爆だったと謝罪済みのレスに文句言う馬鹿って一体何考えてるの?
578:デフォルトの名無しさん
08/02/26 10:36:12
脊髄で書いてるのだろう
579:デフォルトの名無しさん
08/02/27 17:15:56
脊髄電脳化w
580:デフォルトの名無しさん
08/02/28 00:56:57
マルチスレッド対応の
ハッシュリストのソースコードとかある?
581:デフォルトの名無しさん
08/02/28 12:32:38
ハッシュは速いのが売りなんだから、まるごとクリティカルセクションで包んでおけ
582:デフォルトの名無しさん
08/02/28 12:51:50
>>580
Javaのjava.util.concurrent.ConcurrentHashMap
583:デフォルトの名無しさん
08/02/28 13:19:30
javaならHighly Scalable JavaのNonBlockingHashMap等
URLリンク(sourceforge.net)
584:デフォルトの名無しさん
08/02/28 16:02:03
>>581
意味ねーw
585:デフォルトの名無しさん
08/02/29 23:39:30
同期処理なんてしなくてよし。
すべては運任せ。
マルチスレッドの邪神様に任せておきなさい。
586:デフォルトの名無しさん
08/03/03 11:34:48
コア1個ならなんとかなるさ、きっと
587:デフォルトの名無しさん
08/03/03 21:36:55
●5 コアは一個だが、HTだった
588:デフォルトの名無しさん
08/03/03 23:09:15
HTといえば、マルチコアの場合は異なるコア同士が同じキャッシュラインに
アクセスしない方がいいけど、HTの場合は逆になるの?
589:デフォルトの名無しさん
08/03/03 23:49:44
マルチプロセッサ・マルチコア・HTで論理CPUが8個とかってどこのXEONだっけ?
590:デフォルトの名無しさん
08/03/04 16:41:04
AMDのです
591:デフォルトの名無しさん
08/03/04 22:30:10
>>588
キャッシュが共有の場合は、キャッシュラインが同じでもOK。そのほうが効率よい。
キャッシュが分かれている場合は、同じキャッシュラインへの書き込みは最悪になる。MESIプロトコルで具具ってみよう。
592:デフォルトの名無しさん
08/03/05 13:50:16
URLリンク(journal.mycom.co.jp)
HTMって性能出るのかな。。
593:デフォルトの名無しさん
08/03/05 14:19:28
トランザクションメモリって、
JavaのAtomicReference#compareAndSetみたいなのじゃだめなの?
594:デフォルトの名無しさん
08/03/05 16:58:48
失敗したとき、その中でやったことは全部無しにしてくれるんだろうか?
>>593 良い場合もあるけど、例えば、複数のHashMapとかをatomicに操作したい場合は面倒じゃない?
595:デフォルトの名無しさん
08/03/05 23:18:48
マルチスレッドなくなってしまう。
今までがずっとCPUだと思っていたものは、実はスレッドなんで、。
596:デフォルトの名無しさん
08/03/06 02:46:25
Windowsでの条件変数実装の話題蒸し返したいので、俺の調査結果を晒してみる。
apr -> 再帰mutex非サポートぽい?簡潔過ぎるし、他にもバグあるだろ絶対。
yaneSDK3rd::LockObject -> すごく分かりやすい実装。再帰ロックしてのwaitにバグあり。修正は簡単。
boost::condition -> 複雑。完璧なのか?タイムアウト監視にシステム時刻使ってるのが嫌。
自前のC++ライブラリ構築して使ってるが、
yaneSDK3rdベースの実装からboostベースに交換してみようと思って
とりあえず、boost::xtime使ってる部分はGetTickCountに変えた。
システム時刻は某通信プロトコルでいつでも変更されてしまうので。
っつーか、clock()とかにもFILETIME使ってるのってどうなのよ・・・
boost実装に>>473のような問題が無いか検証しようとしてるが、
こいつのアルゴリズムは結構複雑で手強そうだ・・・
肝心のACEのソースはまだ読んでない。
597:デフォルトの名無しさん
08/03/07 02:19:24
条件変数の用途って
生産者/消費者的な使い方がかなりの部分を占めると思うんだけど、違うかな?
そういう用途のみに限れば、IOCP使えば充分なんじゃないのかね。
キューにデータがあるときはカーネルに行かないって言明されてるし。
598:デフォルトの名無しさん
08/03/08 02:15:16
無知を承知で聞くけど、ユーザーモードに限って言えば
普通はCriticalSection一択じゃないの?
CriticalSection自体がSpinCountの設定次第でカーネルモードにいかないようになってるから
そのチューニングで大体の用途には間に合うと思うんだが。
VistaだとRead/Writeロックが実装されたから、そっち使ったほうが早いかもしれんけど。
599:デフォルトの名無しさん
08/03/08 18:32:59
Windowsはあまり知らないんだけど、Enter/Leaveしか出来ないの?
600:デフォルトの名無しさん
08/03/08 19:25:08
TryLock もバージョンが↓でなければできる
601:デフォルトの名無しさん
08/03/16 09:31:31
VC++Windowsアプリの質問です。
メッセージループを1つのスレッドに隔離しようと思うのですが、
PostQuitMessage(0)を別スレッドから単純に呼び出しても安全でしょうか?
HWND g_hWnd
BOOL g_Active;
// g_Activeをクリティカルセクション内でやり取り
BOOL fGetActive();
VOID fSetActive(BOOL isActive);
INT WINAPI WinMain(...){
fSetActive(TRUE);
g_hWnd = (ウインドウハンドル作成);
メッセージループ用スレッド生成
while( fGetActive() ){
if(...) PostQuitMessage(0);
}
メッセージループ用スレッド後処理
return 0;
}
UINT WINAPI MessageLoop(...){
MSG msg;
msg.hwnd = g_hWnd;
while (GetMessage(&msg, NULL, 0, 0) > 0){
...
}
fSetActive(FALSE);
return 0;
}
602:デフォルトの名無しさん
08/03/16 11:40:27
サブスレッドからアプリケーションを直接終了させる設計は変じゃないか。
メインスレッドに何らかのメッセージを送って、メインスレッドからアプリケーションを終了すればよいじゃない。
面倒なら、少々強引だが、PostThreadMessageでメインスレッドに
直接WM_QUITを送りつけるのも。あまりお勧めしないが。
603:デフォルトの名無しさん
08/03/16 12:57:27
ウィンドウはそれを作ったスレッドに結びついているよ
604:デフォルトの名無しさん
08/03/16 13:10:12
>>601
PostQuitMessageを別スレッドから呼び出すことは問題ないけど、
メッセージは、ウィンドウの作成元のスレッドにしか来ないよ
別スレッドでGetMessageしたかったら、そっち側でCreateWindowしないとだめ
605:604
08/03/16 13:11:34
>PostQuitMessageを別スレッドから呼び出すことは問題ないけど、
って、ウソでした、カレントスレッドにWM_QUITを送るだけか
PostThreadMessageで相手スレッドにWM_QUITを送ればいいかも
606:デフォルトの名無しさん
08/03/16 14:31:10
>>602-605
ありがとうございます。
MSG構造体へメッセージを送る際のデッドロックが心配でした。
>>602
>サブスレッドからアプリケーションを直接終了させる設計は変じゃないか。
ウインドウモードだと×からも終了させる場合があるのと、
メインスレッドのID取得が難しそうなので変えられなそうです。
607:デフォルトの名無しさん
08/03/16 22:42:23
>メインスレッドのID取得
プログラム開始時にメインスレッドから GetCurrentThreadId を呼んで、
メインスレッドのIDが取得して、それをグローバル変数にでも入れておけば良いかも。
それがいやなら、メインスレッドにくくりついている非表示ウィンドウを一つ作っておいて、
そこに向かって PostMessage して、メインスレッドにメッセージをポストするのも手。
windowsではよくある話。
608:601、606
08/03/17 15:08:05
もう一つ質問させてください。
メインスレッドがウィンドウを持ち、GetMessageのループをしていてかつ、
サブスレッドがメインスレッドのウィンドウにDirect3Dで描画している場合、
GetMessageとDirect3DがHWNDへのアクセス権をもめてクラッシュしますか?
609:デフォルトの名無しさん
08/03/17 16:22:56
swapchainでググれ
610:デフォルトの名無しさん
08/03/17 17:00:28
サブスレッドでバックバッファに書き込んだ後、
メインスレッドにバッファを転送するべきという意味ですか?
うーん……
611:デフォルトの名無しさん
08/03/17 21:18:56
>>608
クラッシュしませんよ。
ただ、例外があって、ディバイスをリセットするときだけはディバイスを作成したスレッドからリセットを
コールしてあげないといけないからその点は注意。
メインスレッドでディバイスを作成した場合は、サブスレッドからはリセットは出来ない。
なので、もし、サブスレッドからディバイスをリセットする場合は、
まず、適当な自作ウィンドウメッセージをサブスレッドからメインスレッドのウィンドウに投げて、
メインスレッドのウィンドウがそれを拾ったらメインスレッド側から
ディバイスをリセットする。
612:デフォルトの名無しさん
08/03/18 21:47:01
Linux 2.6.21です
sigwait()しているスレッドに他のスレッドからpthread_cancel()を実行してもスレッドがキャンセルされません
sigwait()はキャンセルポイントのはずなのになぜ、と困惑しています
うちの環境のみなんでしょうか
もしくはLinuxの仕様?
613:612
08/03/19 07:24:50
すいません、自分の勘違いでした
614:デフォルトの名無しさん
08/03/25 19:48:12
すいません。教えてください。
linux 2.6.20でpthreadです。
sched_get_priority_minとsched_get_priority_maxで優先度の
最大値と最小値を得たところ両方0でした。
これは優先度を選択できないということでしょうか。
優先度の最大値、最小値を得るのに使った引数は
sched_getscheduler(getpid())で値は0でした。
よろしくおねがいします。
あ、あと書き忘れましたがlttng0.9.0のパッチを当ててます。
615:デフォルトの名無しさん
08/03/25 20:06:05
>>614
URLリンク(www.linux.or.jp)
>Linux では SCHED_FIFO と SCHED_RR では 1 から 99 の範囲の静的プライオリティーを持ち、
>SCHED_OTHER と SCHED_BATCH ではプライオリティとして 0 を持つ。
616:614
08/03/25 21:04:25
ありがとうございます。
優先度を指定しよう思ったらSCHED_FIFOかSCHED_RRにしろということですね。
考えて見ます。
617:デフォルトの名無しさん
08/03/26 02:52:53
RTの付いたカーネルじゃないとダメじゃなかったっけ?
618:デフォルトの名無しさん
08/03/31 00:04:13
Numaで確保した共有メモリ内に
pthread mutext仕込むと
Numaで共有しているマシン間で
排他取れるの?
619:デフォルトの名無しさん
08/03/31 13:08:46
出来ないの?
620:デフォルトの名無しさん
08/03/31 22:36:00
教えてくれよw
621:デフォルトの名無しさん
08/04/01 07:07:46
POSIX準拠なら取れないとおかしいという結論になるはず。
「NUMAで確保したの共有メモリ」がPOSIX準拠かどうかまでは知ったこっちゃねぇ。
622:デフォルトの名無しさん
08/04/01 16:27:39
もし出来ないなら、アドレス空間が共有できてもうれしくないと思うんだが。
割と普通なOpteron複数搭載機ではまる人が続出しそう。
623:デフォルトの名無しさん
08/04/09 23:10:05
URLリンク(docs.sun.com)
この関数ってなんか役に立つの?
624:デフォルトの名無しさん
08/04/10 00:11:50
??
625:デフォルトの名無しさん
08/04/10 00:19:17
>>623
リード側と書き込み側の間でブロックしにくくなるんじゃないかな?
626:デフォルトの名無しさん
08/04/10 00:37:03
>>625
じゃあmutexでおk?
627:デフォルトの名無しさん
08/04/10 05:29:38
??
628:デフォルトの名無しさん
08/04/10 09:01:57
read同士でblockしない点が有用。
629:デフォルトの名無しさん
08/04/10 10:00:18
あるデータAをRWロックでブロックしてるとする
スレッド1がAを読み込もうとしてるときに・・・
スレッド2がAを読み込むことがある
スレッド3がAを書き込むことがある
となっている2つの場合を考える
もしスレッド1と2のみであれば、Aの値は不変のはずだから
1が処理中でも2は処理できる。
つまりRead同士ではブロックする必要がない
しかし、1と2が処理中に3が処理しようとするとおかしくなる。
だから読み込み同士ではブロックないが
書き込みはブロックしないといけない。
これがReadロック。
逆に、3が動いているときに、1と2が読み込もうとしている場合は
3が終わるまでは1も2も読み込んではいけない。
スレッド4が書き込みをしようとしてたとして、これも当然ブロックしないといけない。
つまり排他処理するのがWriteロック。
これをMutexに置き換えると、Read同士でブロックしてしまう可能性があるので
その頻度によってパフォーマンスが落ちることが考えられる。
しかし、とりあえず動かすことが重要であれば、置き換えるだけでも動く。
630:デフォルトの名無しさん
08/04/12 12:43:28
マルチスレッドで仕事量分割するための
手法説明している本ってないっすか?
631:デフォルトの名無しさん
08/04/12 15:24:51
VC6でマルチスレッドのアプリ作ってるんだがトラウマになりそうだ
632:デフォルトの名無しさん
08/04/12 22:27:49
マルチスレッド間で
カスタムメモリアロケタ君を
書きたいけど基本的なロジックとか
みんな何参考にしてるの?
633:デフォルトの名無しさん
08/04/13 23:00:37
すみません。
デバッグ中に、CPU帯域を独占してるスレッドを特定したいのですが。
なにかいい方法はありませんか?
開発環境はVisualStudio2005で言語はVC++です。
634:デフォルトの名無しさん
08/04/14 00:02:22
パフォーマンスモニタでスレッドIDごとの負荷率が出る。
スレッドIDはデバッガで一時停止のスレッドで見られる
635:デフォルトの名無しさん
08/04/14 00:17:59
>>634
ありがとうございます。
特定できました。
636:デフォルトの名無しさん
08/04/18 07:54:17
>>635
特定しました。
637:デフォルトの名無しさん
08/04/18 14:08:38
特定しますた
638:デフォルトの名無しさん
08/04/18 22:40:16
lock-freeアルゴリズムの
検証方法教えてくれよ
どうやって正当性保障するんだよw
あれ難しすぎだ
639:デフォルトの名無しさん
08/04/20 18:56:56
SPINみたいなのを使うんだろうか?
640:デフォルトの名無しさん
08/04/20 23:36:09
volatileで十分
641:デフォルトの名無しさん
08/04/21 00:52:23
原論文に検証あるだろ?
642:デフォルトの名無しさん
08/04/21 21:53:58
それが理解できないから、易しく解説して
って言う話じゃないのかな。
643:デフォルトの名無しさん
08/04/21 22:43:36
数式での検証と
実装の検証は違うと思うのは俺だけw?
俺は頭が悪いんだろうなw
644:デフォルトの名無しさん
08/04/21 23:37:15
うん、頭が悪い。
「プログラムの正しさの証明」って言われて、
この証明が数学で言う証明のことだと理解できないタイプ。
645:デフォルトの名無しさん
08/04/22 07:35:55
実用性ない数式出されてもなぁ
後から付帯条件つきまくる数式
出されてもなぁ
646:デフォルトの名無しさん
08/04/22 09:36:27
マジで頭悪そう
647:デフォルトの名無しさん
08/04/22 22:16:26
ここも過疎ってるよなぁw
648:デフォルトの名無しさん
08/04/23 08:00:42
一覧に無いからだと思うあげ!
649:デフォルトの名無しさん
08/05/02 17:43:24
自作板にいるキチガイです。シングルスレッドで作成されてるソフトが
カーネルによってマルチコアにスレッド(タスクのことか?)が分散されると申しております。
このIDだけの発言では分かりにくいが、このスレにはシングルスレッドでもマルチコアのほうが早いと
のたまわってるキチガイがいます。
まだまだシングルCPUで頑張る人集合
スレリンク(jisaku板)
800 Socket774 sage New! 2008/05/02(金) 08:31:32 ID:Aaj/7HlH
このスレのシングルコアユーザーは未だにWindows3.1を使ってるようだw
801 Socket774 sage New! 2008/05/02(金) 08:32:49 ID:Aaj/7HlH
プログラムのスレッドと
CPUが処理する単位のスレッドは
意味が違うw
802 Socket774 sage New! 2008/05/02(金) 08:42:42 ID:Aaj/7HlH
プログラムのスレッドはカーネルによってさらに細分化される
与えられたCPUタイムによってそれを1つづつ実行していく
大まかに2ブロックに分割されたとしよう
1コアが1ブロックを実行してCPU使用権が終了する
その時に2コアが暇をしてるので2ブロックに即座に使用権が渡される
つまり単純に2倍の処理性能になる
806 Socket774 sage New! 2008/05/02(金) 10:52:29 ID:Aaj/7HlH
いやだからマルチスレッドOSって時点で
実際のCPU利用率は半分以下なんだよ
どんだけがんばってもそうなの
シングルコアだったら100%使えるとかないからw
コアが2になるとより100%に近い状態になるわけ
一般に1.8倍だと言われる
MS-DOSやWindows3.1を使ってる人はシングルコアのが早いかもねwww
807 Socket774 sage New! 2008/05/02(金) 10:57:04 ID:Aaj/7HlH
>>803
ベンチマークのような単純処理の繰り返しではスレッドの細分化はほとんど行われない
ゲームみたいな大きなスレッドになると実際に4倍近くの性能を発揮する
650:デフォルトの名無しさん
08/05/02 17:51:33
>>649
頭のおかしな人というのはある程度の確率で常にあらわれるものであって、
そういう人がいるのはおかしいとか、説明して頭をよくしてあげよう等の考えは
全くの無駄だと思う。中身の入って無い枝豆同様ハズレとして無視するよりない。
いらいらする気持はわかるけどね。
651:デフォルトの名無しさん
08/05/02 17:52:33
コピペ君に応答する奴も馬鹿だな、まで読んだ。
652:デフォルトの名無しさん
08/05/02 19:14:41
osのタスク切り替え戦略によってはそうなるかもしれないけど、
普通は強制的な一定タイムスライスじゃないよね。
システムコール待つのにビジーウェイトでもしてると思ってんのか。
653:デフォルトの名無しさん
08/05/02 20:14:27
ほかのタスクや割り込み処理に割り込まれる可能性が減る(ほかのCPUに割り振られる)から
「遅くなりにくい」ということはいえるが
速くなることはないだろうなあ。
って件のスレで当人書いてるじゃん
654:デフォルトの名無しさん
08/05/02 21:56:31
1coreの時にOS側のタスクによるオーバヘッドが1%程度あったとすると
2coreならアプリの実行時間が1%短くなる程度なら有り得る
655:デフォルトの名無しさん
08/05/03 06:58:19
ゲームでならDirectSoundは別スレッドで動いてるので
もうちょっと効果あるかもね。
656:デフォルトの名無しさん
08/05/03 08:29:25
例えばX11だと描画はサーバプロセスが行なうから結構効果がありますね。
でもそれをシングルスレッドアプリが速くなると言ってしまうとちょっと違うと思いますが。
657:デフォルトの名無しさん
08/05/03 08:33:56
よっぽど単純なプログラムでもない限り
完全なシングルスレッドなんてあり得ないんですけどねw
658:デフォルトの名無しさん
08/05/03 08:40:56
たとえばEXCELで
再計算処理が行われてる時にメニューを実行すると
再計算、描画、メニューの3つのスレッドが形成される
659:デフォルトの名無しさん
08/05/03 08:47:38
ビス太のユーザーランドスレッドの方針を分かって話してるの?
660:デフォルトの名無しさん
08/05/03 12:26:31
スレッドプールのはなし?
661:デフォルトの名無しさん
08/05/03 15:17:42
>>658
スレッドが生成されるかどうかと
並行実行するかどうかは別だぞ
662:デフォルトの名無しさん
08/05/03 18:15:41
OpenMP中で使ってるとか
そんなんじゃねーのw
663:デフォルトの名無しさん
08/05/03 19:22:28
>>661
XPでは平行実行してるが?
664:デフォルトの名無しさん
08/05/03 19:59:25
>>663
させるかどうか、だ
665:デフォルトの名無しさん
08/05/03 23:51:43
シングルスレッドでコンパイルするやつはいないだろw
666:デフォルトの名無しさん
08/05/04 00:40:42
それまでの話の流れとは関係ないが
「マルチスレッド対応ライブラリを使用する」と
「マルチスレッドで動作するプログラムにする」は全く違うのだが
まさかとは思うが、>>665はそういう意味じゃないよな?
当然、「コンパイラをマルチスレッドで動作させる」だよね?
一応触れておくと
Win32で普通にGUIプログラムを作る場合、明示的にスレッド関連の操作をしない限り
マルチスレッドで動くことは無い。
何故なら、メッセージキューが1スレッドに1つ作られるので
そこからのイベントで処理を記述する書き方だと、1スレッドにしかならないから。
(イベントハンドラでスレッド操作をすれば当然マルチスレッドも可能)
もちろん、カーネル内の処理(割り込み等)は別。
667:デフォルトの名無しさん
08/05/04 00:59:30
そういえば、Win9xのWinsock2の非同期処理は
内部的にスレッド作って擬似動作させてたんだっけ。
忘れてた。
668:デフォルトの名無しさん
08/05/04 01:14:13
>>666
メッセージキューも明示的に作る(作らせる)ものであって
スレッド作成=メッセージキュー作成じゃないよ。
669:デフォルトの名無しさん
08/05/04 12:10:33
> メッセージキューも明示的に作る(作らせる)ものであって
具体的にどうやって作るの?
670:デフォルトの名無しさん
08/05/04 12:39:33
MSDNのPostThreadMessageの所に書いてあるな
671:まあ、明示的がどうかは人によって違うと思うが...
08/05/04 16:07:57
これのことかな...
> その後、ポスト先のスレッドで、
> PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) を呼び出し、
> このスレッド用のメッセージキューを強制的に作成します。
でもこれって、
> スレッドが Win32 のユーザー関数または GDI 関数のいずれかを最初に
> 呼び出した時点で、システムはそのスレッドのメッセージキューを作成
> します。
ってことだよね。
あまり「明示的」とは思えないんだが...。
672:デフォルトの名無しさん
08/05/04 17:10:13
風が吹いたら桶屋が儲かるくらい暗黙的でなければ明示的
673:デフォルトの名無しさん
08/05/04 22:53:30
いや別にメッセージループに入ったからといって
CPUを最後まで占有出来るわけじゃないのだ
途中で強制的に割り込まれる
そうすると他のループに権利が渡されるだけだな
マルチスレッドでコンパイルすると各メッセージループは完全に独立したスレッドになる
だから既存のアプリもほとんどはデュアルコアの恩恵がある
674:デフォルトの名無しさん
08/05/04 23:11:24
おまえはそんなにメッセージループを作っているのか?
大多数のアプリはWinMainの中のGetMessage1つだけだと思うが
675:デフォルトの名無しさん
08/05/04 23:12:03
それと、「マルチスレッドでコンパイルする」の意味を具体的に説明しろよ
676:デフォルトの名無しさん
08/05/04 23:14:14
上の方は、プリエンプティブマルチタスクの解説で、4行目の
「他のループ」=「他のプロセスのメッセージループ」なのかなー
と思って読んでいたが
>マルチスレッドでコンパイルすると各メッセージループは完全に独立したスレッドになる
え?
677:デフォルトの名無しさん
08/05/05 00:56:45
ちょっぴりエスパー能力を発揮して解読してみた。
普通、「メッセージループ」と言うと
while (GetMessage()) { ... } の部分のことを指すと思うのだが
おそらくこのヒトは、DispatchMessageで間接的に呼ばれるルーチン、
大抵は「WndProcの呼び出し1回」のことを
「メッセージループ」と呼んでいるような気がする。
678:デフォルトの名無しさん
08/05/05 01:18:24
だとしてもウインドウプロシージャがマルチスレッドで
並列実行されたりはしないと思うが。
679:デフォルトの名無しさん
08/05/05 01:48:05
もちろんその通り。
大丈夫、基本的な仕組みを理解してないのは、多分一人だけだから。
680:デフォルトの名無しさん
08/05/05 03:39:24
え? そうなん?
メッセージループをマルチスレッドでコンパイルしたら
完全にプリエンプティブなマルチコアになるでしょ
681:デフォルトの名無しさん
08/05/05 05:18:58
だからその「マルチスレッドでコンパイル」って、何をどうすることなの?
682:デフォルトの名無しさん
08/05/05 05:34:27
一応、>>666の前半部に、候補としていくつか挙げてあるけど
・マルチスレッドライブラリを使用する(コンパイラオプションを設定)
・マルチスレッドで動作するようにソースコードを書き換えてコンパイルし直す
・コンパイル時にコンパイラがマルチスレッドで動作するオプションを使う(対応しているもののみ)
・その他
ところで、「プリエンプティブなマルチコアになる」って何?
「マルチスレッドでコンパイルする」「メッセージループがスレッドになる」に続いて
またまた第三者からは理解不能な言葉が出て来てるんですけど。
683:デフォルトの名無しさん
08/05/05 05:37:36
>>680
これは釣りだろ
684:デフォルトの名無しさん
08/05/05 06:45:01
「マルチスレッドでコンパイルする」
そういえばVS2005から並行コンパイルができるようになったけど
そのことかな。
685:デフォルトの名無しさん
08/05/05 08:03:25
>>683
知ってる単語を並べただけと言う疑惑も捨てがたい。(w
686:デフォルトの名無しさん
08/05/05 10:57:32
データを完全にシーケンシャルに
処理する必要があるのに
スレッドの接続形態が
1-N-1って場合って
どんな利点があるの?キュー作っても処理遅くなるだけじゃね?
687:デフォルトの名無しさん
08/05/05 11:26:27
メッセージの元になるイベントは、システム全体に対して非同期に起こるんだよ。
おまいのアプリ上だけじゃないし、処理終了を待って定期的に起こるわけでもない。
688:デフォルトの名無しさん
08/05/05 14:20:25
マルチスレッドでコンパイルする=MTsafeにするだろう