マルチスレッドプログ ..
202:デフォルトの名無しさん
07/10/12 23:27:18
>>>200
いや、今の状況はさー、
のんびりすべきだ、のんびりしよう、
とか言って急ブレーキ掛けてた頃からは、
実はもうだいぶ経っててさ、逆にのんびりしすぎてるんじゃ?
って密かに周りが焦り始めてるんだけど、
具体的な問題が出てくるまでは、それにあえて気付かない
フリをしていよう、ってところなんだよ。
ほんとうは、そろそろ歩きださないと。いそがないと!
って時なんだよ?
一度怠けると元に戻れなくなるって言うけど、それ以前に
元がどうだったかなんて忘れてるもんだからさ、
フリじゃなくてほんとうに気付いてないのかもしれないね。
日本ヤバイよー。
おれは海外に移住する予定です。
203:デフォルトの名無しさん
07/10/21 20:33:43
SolarisでpthreadでC++です。
C* c;
int main() {
c = new C;
と、mainの先頭で生成したオブジェクトを、N個のスレッド(実際は8個固定)から使っています。
スレッドが順次終了してゆき、最後のN個目が終了した直後、あるいはN-1個目が終了した
後かつN個目が終了する直前にdelete c;をしたいのですが、うまい方法はあるでしょうか。
リファレンスカウントでしょうか。
N個のスレッドすべてをpthread_join()するような、親スレッドはいません。
なお、Cのメンバ関数はすべてスレッドセーフに作られています。
よろしくおねがいします。
204:デフォルトの名無しさん
07/10/21 20:36:29
>>203
リファレンスカウントで何か不満なの?
boost::shared_ptr ですぐに実装できそうだし。
205:203
07/10/21 20:41:02
>>204
boostやSTLが使用禁止なので、一から手書きする場合の例をいただけたらと。。
テンプレートは使用可です。
206:デフォルトの名無しさん
07/10/21 20:47:33
>>204
スレッドをまたいでshared_ptrを渡すのって例えばどうやるの?
207:デフォルトの名無しさん
07/10/21 21:24:12
> boostやSTLが使用禁止なので
ぬふぅ
208:デフォルトの名無しさん
07/10/21 21:24:57
>>203
代入系の演算子をoverrideしまくればそれっぽいの出来るけど、
用途をみてるとそれだけのためにshared_ptrを実装するのはもったいないな。
209:デフォルトの名無しさん
07/10/21 21:45:00
>>205
boost の実装見ればいいじゃん。
210:デフォルトの名無しさん
07/10/21 21:46:15
>>206
スレッドごとに shared_ptr のコピーを持てばいい。
211:デフォルトの名無しさん
07/10/21 23:17:11
>>210
boostのshared_ptrの参照カウントの上げ下げってスレッドセーフだっけ?
最新のstableでもなにもしてなかったような。
212:203
07/10/21 23:58:41
みなさまどうも。
>>210
shared_ptr<C> g;
int main() {
g.reset(new C);
// スレッドを8つ生成
cond_wait; // スレッドがgをコピーするのを待つ
g.reset(0);
...
}
void* thr(void* data) {
shared_ptr<C> local = g;
cond_signal;
...
}
とかですか。
213:デフォルトの名無しさん
07/10/22 04:26:17
チラシの裏で悪いけど、g++のbits/atomicity.hの__exchange_and_add()とか使うと、
libstdc++.soの関数を呼びに行くんだね。おそそー。
214:デフォルトの名無しさん
07/10/22 08:13:39
>>211
スレッドセーフではないとすると、参照カウントを上げる方は、
>>212のやりかたでも、一個ずつスレッドを作って、
cond_waitすればいいけど、下げる方は排他制御しないと
駄目って事かな?
単純な実装にするなら、
全スレッドが共用するカウンタを作って、上げ下げすればいいんじゃないのか?
最初と最後だけなら、速さとかは気にせずに、適当な実装でも問題なさそうだし、
atomicな操作ができるなら、それこそカウンタだけ渡せば済むし。
Cがいじれるなら、自分自身でカウントしても良さそうだけど。
どうでもいいけど、>>212は、グローバル以外の渡し方はないのか?
215:デフォルトの名無しさん
07/10/22 16:47:54
>>214
void* data 経由で渡して、スレッド側でstatic_cat<shared_ptr<C*>* >することは可能。
スマートポインタへのポインタを渡すことになって気持ち悪いけど。
216:デフォルトの名無しさん
07/10/22 18:27:07
どのみちmainは生きてるんだから
mainでjoinで待って削除すればいいのでは
217:デフォルトの名無しさん
07/10/22 18:53:14
>>216
>>203
>N個のスレッドすべてをpthread_join()するような、親スレッドはいません。
218:デフォルトの名無しさん
07/10/22 21:44:40
クラスCをsingletonにするのは無し?
219:デフォルトの名無しさん
07/10/22 21:55:54
>>214
そうですね。スマートポインタは使わず、単純なカウンタ+アトミック操作でいこうとおもいます。
>>218
決してdeleteされないsingletonにするのはNGです。threadが全部いなくなったら、deleteしないとまずい
事情があります。
ありがとうございました。
220:デフォルトの名無しさん
07/10/22 22:05:42
スレッドの調停者が居ない=全てのスレッドが終了時にアプリケーションが終了
なら,singletonでも別にもんだいねーよーな気がする
221:デフォルトの名無しさん
07/10/22 22:12:26
>>220
スレッドが全部終了した段階では、アプリケーションは終了しません。
また、その段階で~C()をよばないと、いろいろまずいことがあります。
222:デフォルトの名無しさん
07/10/22 22:19:30
>>220
誰がスレッドを最終的に所有してるの?
223:デフォルトの名無しさん
07/10/22 22:22:45
素直にスレッドのマネージャを作れば
224:デフォルトの名無しさん
07/10/22 22:25:30
>>222
メインスレッドaを起点として、ツリー状に生成・所有されています。
a-b-c-N1
-d-N2
e-f-g-N3
-N4
-h-N5-N6
-N7
-N8
みたいなひどい感じです。Nxが、今回興味のあるスレッド群。
何でこんなことになってるのかの経緯は、私にはちょっとわかりません。。。
225:デフォルトの名無しさん
07/10/22 22:27:37
>>224
こんなはちゃめちゃになるんだったら
マネージャ作れよ
GCとかみたいに自分で管理したくないものは
誰か権限のあるやつだけに委譲しろよ
226:デフォルトの名無しさん
07/10/22 22:28:56
>>225
managerとは、具体的には何をするものでしょうか?
227:デフォルトの名無しさん
07/10/22 22:38:42
スレッドのリソースの管理
228:デフォルトの名無しさん
07/10/22 23:06:01
>>227
ありがとうございます。
>>214
参照カウントは、URLリンク(www.open-std.org) あたりを参考にすればいいのかな。
4-8個程度はCPUの乗ったSPARCが相手だと、atomic_inc/decだけでは実装できないよね。このあたりに詳しいかた、コメント
いただけませんか?
229:デフォルトの名無しさん
07/10/22 23:11:23
>>228
アトミックなカウンタ操作があっても実装できない理由って何?
230:デフォルトの名無しさん
07/10/22 23:11:56
アトミック云々以前にスレッドの管理が出来てないんじゃ意味ないだろ
231:デフォルトの名無しさん
07/10/22 23:15:43
>>229
複数のCPUが同時にatomic_incを実行すると破綻するから
232:デフォルトの名無しさん
07/10/22 23:18:14
そんなのはアトミックじゃねぇ
233:デフォルトの名無しさん
07/10/22 23:19:53
>>231
その atomic_inc はアトミックじゃないのかい?
234:デフォルトの名無しさん
07/10/22 23:26:06
っSMP
235:デフォルトの名無しさん
07/10/22 23:27:42
>>232-233
そういうCPUもあるし、そうでないCPUもある。
236:デフォルトの名無しさん
07/10/22 23:35:39
そうでないCPUでは、それはただの x++ とどう違うの?
237:デフォルトの名無しさん
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つのスレッドを開始させ、
一つのスレッドが終了次第、
ほかのスレッドも全て終了させる方法ってありますか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5390日前に更新/193 KB
担当:undef