マルチスレッドプログラミング相談室 その2

このエントリーをはてなブックマークに追加
943デフォルトの名無しさん:04/10/15 21:26:53
スレッドセーフかどうか自分のソースコードを見ても確認できないなどというのはおかしい。
潜在するロジック上のバグと違い、スレッド関連は明らかにヒューマンエラー。
944デフォルトの名無しさん:04/10/15 23:42:22
>>943
ええっ!?
ロッキングロジック上の馬具は一体何?
945デフォルトの名無しさん:04/10/16 00:28:36
ヒューマンエラー
946デフォルトの名無しさん:04/10/16 01:22:10
結局シングルトンのインスタンスはどう返せばいいんだろ
947デフォルトの名無しさん:04/10/16 01:44:14
class Singleton
{
private:
  static Singleton instance;
  Singleton();

public:
  static Singleton getInstance();
};

Singleton::Singleton()
{
}

static Singleton Singleton::getInstance()
{
  if(instance == null){
    LOCK();
    if(instance == null){
      instance = new Singleton();
    }
    UNLOCK();
  }

  return instance;
}
948デフォルトの名無しさん:04/10/16 06:26:24
DCLなんてしてないでイニシャライズとファイナライズをmainとかに書いとけばいいじゃん。
シンプルだし、最適化がどーのなんて悩まないで済むんだし。
949デフォルトの名無しさん:04/10/16 06:39:18
それはシングルトンの場合でしょ。
それで済むときはそれで構わない。
# 但しシングルトンの時も、シングルトン間の初期化の順序を制御したい場合、
# 動的に確保されるシングルトンの場合はダメ。

またDCLはオブジェクトがある条件を満たした時に、
初めて行われるポインタメンバーの初期化などに必要。
950デフォルトの名無しさん:04/10/16 10:47:58
>>942
> 最初から意識して作るしかないだろう

同一のインスタンスに対する並行アクセスはダメ、というケースはよく見るね
使う側からすると、下手にロックされても困る場合もあるから
ライブラリの設計は難しい・・・
951デフォルトの名無しさん:04/10/16 16:15:43
>>950
次スレよろ
参考リンクも何もないな

以下テンプレ



マルチスレッドプログラミング相談室 その3

その1 http://pc3.2ch.net/test/read.cgi/tech/997345868/
その2 http://pc5.2ch.net/test/read.cgi/tech/1037636153/
952デフォルトの名無しさん:04/10/16 16:34:01
過疎スレなのにそんなに早く次スレ立ててどうするの?
953デフォルトの名無しさん:04/10/16 18:09:46
950過ぎたんだから別に何時立とうがどうでもいい話だな
954デフォルトの名無しさん:04/10/16 20:47:06
スレッド立てる前にちゃんとロックしてね。
955デフォルトの名無しさん:04/10/16 20:55:40
いやむしろマルチスレッドで
956デフォルトの名無しさん:04/10/16 22:42:44
デッドロックする予感
957デフォルトの名無しさん:04/10/16 23:30:33
食学者の哲事問題で
958デフォルトの名無しさん:04/10/17 00:17:04
Pthread_mutex_lock(CriticalSection);
959デフォルトの名無しさん:04/10/17 00:17:55
Pthread_mutex_lock(CriticalSection);
960デフォルトの名無しさん:04/10/18 08:45:36
>>947
だからそれじゃだめだと何度言ったら…
961デフォルトの名無しさん:04/10/18 09:06:31
駄目な環境と宝刀#ifdefで区切ればいいじゃん
962gccで:04/10/18 10:47:26
#ifdef LINUX
#include <linux/compiler.h>
barrier();
#elifdef XXX
XXX();
#else
#error Unknown system about memory barrier!!!
#endif
963あれば:04/10/18 10:51:16
964デフォルトの名無しさん:04/10/18 19:35:53
>>960
何がダメなのよ?
965デフォルトの名無しさん:04/10/18 20:26:57
どうやら話が振り出しに戻ったようですな。
966デフォルトの名無しさん:04/10/18 23:17:34
>>965
ループするのはやめときます。
967デフォルトの名無しさん:04/10/18 23:19:10
俺はもうひらき直ってインスタンス返却関数に毎回ロック掛けてます
968デフォルトの名無しさん:04/10/19 08:15:06
KeMemoryBarrier()が使えるのはドライバのみ?

969デフォルトの名無しさん:04/10/19 10:23:46
>947
2重チェックなんか無駄でしょう。
このメソッドを連続して複数回呼ぶとしたらそのつくりがおかしい
メソッド全体にロックかければ十分
970デフォルトの名無しさん:04/10/19 12:33:00
>>969
すでにインスタンス作ったのにインスタンス取得の度にロックするほうが時間の無駄でしょうが
971デフォルトの名無しさん:04/10/19 12:47:10
getInstanceをループの中で毎回呼ぶのですか?
そうはしないし、それならば多少時間がかかっても問題がない。
無意味な最適化をするとバグを混入する原因となりかねないのでシンプルにしたほうがいいと考えています。
972デフォルトの名無しさん:04/10/19 12:51:58
>>971
>getInstanceをループの中で毎回呼ぶのですか?

ハァ?(゚Д゚)
973デフォルトの名無しさん:04/10/19 13:02:13
>>getInstanceをループの中で毎回呼ぶのですか?

>ハァ?(゚Д゚)

ハァ?(゚Д゚)。Lock処理で何ミリセク処理時間が増えるか知らんが、その呼び出しが問題になるほど繰り返し呼び出すとしたら呼び出してるほうが問題なんだろうが。
キャッシュするなりすればいいという意味だろ。
974デフォルトの名無しさん:04/10/19 13:58:27
>>973
なるべく透過的にキャッシュしたいね、という話をしているわけだが。
俺としてはガイシュツのTLSがいいとおもうね。
975デフォルトの名無しさん:04/10/19 15:13:57
>>968
手持ちのDDKには無かったぞ?
976デフォルトの名無しさん:04/10/19 15:14:08
次スレはこんな感じで


マルチスレッドプログラミング相談室 その3


マルチスレッドプログラミングについて語るスレ。 
OS・言語・環境は問わないが、それゆえ明記すべし。

その1 http://pc3.2ch.net/test/read.cgi/tech/997345868/ 
その2 http://pc5.2ch.net/test/read.cgi/tech/1037636153/ 

Pthread -- POSIX Thread Mailing List
http://www.media.osaka-cu.ac.jp/mailman/listinfo/pthread
977デフォルトの名無しさん:04/10/19 23:47:37
DCLもしらん厨房は早く寝ろ。
978デフォルトの名無しさん:04/10/20 00:20:51
>>977
$ WRITE SYS$OUTPUT "VMS使いのおじいさんですか?"
979デフォルトの名無しさん:04/10/20 00:50:11
>>977
DCL使ってプロジェクトを破滅に追いやるオマエ茂名。
980デフォルトの名無しさん:04/10/20 11:53:49
windowsでもunixでもコンパイルできるマルチスレッドプログラムはどのように書けばよいのでしょうか?
981デフォルトの名無しさん:04/10/20 11:59:16
Ruby!!!!!!!!!!!!
982デフォルトの名無しさん:04/10/20 13:18:24
そーいや、なんでRubyなんだろうな。
まともな言語だって思ってたんだけど、2ch見てるとHSPと同じような位置にしか見えない。
C++なぞ問題外発言の所為?
983デフォルトの名無しさん:04/10/20 13:51:25
スレッドをどのくらいまでなら作っても大丈夫なんですかね。
木構造の接点それぞれにスレッドを割り当てるプログラムで、
枝接点は、ほとんど何もしないラッパー的なスレッドで、
主な処理は、葉接点にあたるスレッドが行うというものですが、
重い葉接点スレッドの実行数を制限すれば、全体で数百〜千スレッド逝っても大丈夫でしょうか。
984デフォルトの名無しさん:04/10/20 13:55:25
環境依存
985デフォルトの名無しさん:04/10/20 14:14:39
>>983
>木構造の接点それぞれにスレッドを割り当てるプログラムで、
>枝接点は、ほとんど何もしないラッパー的なスレッドで、
>主な処理は、葉接点にあたるスレッドが行うというものですが、

まあ、話のタネに聞いておくが、
何でそんなものが必要なんだ?
986デフォルトの名無しさん:04/10/20 14:47:40
>>982
アンチC++やアンチPerl色が強すぎてある意味宗教じみてた頃があったからかな?
今はどうなのか知らないけど
987983:04/10/20 17:02:11
>>985
汎用的な処理を行うシェルのようなプログラムを作成しているのですが、
階層別にグループ化が必須なので。
で、スレッド暴走時の対処や、ある階層以下のすべてのスレッドに命令、セキュリティは?
とか考えると、ルートを一つにするよりも、全部スレッドにしたほうがいいかなと思いまして。
まあ、どっちにしろ最大スレッド数あたりを設定して、そこからあふれた場合はキューにためておいて、
スレッド数が減ってきたら、キューから読んでスレッド作成という動作を実装する必要がありますが。
988デフォルトの名無しさん:04/10/20 18:24:52
スレッド必要な理由がよくわからんのですが・・・
989デフォルトの名無しさん:04/10/20 19:20:44
selectやpollでwaitできないデバイスを扱うのに必要なんだよ。ボウヤ。
990デフォルトの名無しさん:04/10/20 19:25:40
shellならprocess作って走らせるだけだからthreadは複数要らんってことなんじゃね?
991950:04/10/20 19:35:05
次スレをcreateしました。

http://pc5.2ch.net/test/read.cgi/tech/1098268137/l50

関連URL他にないですかねぇ。
992デフォルトの名無しさん
pthread_barrier_init(&b, NULL, 8人);
pthread_barrier_wait(&b);
std::2ch << "1000ゲット!!" << std::endl;