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

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2008/07/01(火) 11:03:56
longって略さずにlong intって書こうぜ?
953デフォルトの名無しさん:2008/07/01(火) 21:14:51
だったらsignedもつけようぜ
954デフォルトの名無しさん:2008/07/01(火) 21:37:24
もちろんdouble floatもだよな?
955デフォルトの名無しさん:2008/07/01(火) 22:17:15
>>949
んな環境みたことねーぞ。例をあげてくれ。

>>954
イミフ
956デフォルトの名無しさん:2008/07/01(火) 23:14:48
>>955
Unix界隈
957デフォルトの名無しさん:2008/07/02(水) 00:04:43
>>955
SPARC/SolarisとかLP64(longとポインタが64bit)って呼ばれる環境がある。
旧DECのAlpha/Digital UNIXのようにILP64(int、long、ポインタが64bit)もある。
Win64のポインタが64bitでint、longが32bitってのは変態すぐる。
958デフォルトの名無しさん:2008/07/02(水) 00:10:34
>>955
Linuxだと long のサイズとポインタのサイズが同じという前提でプログラムが
書かれてることが結構ある(カーネルの時点ですでにそうだし)
64bit環境で普通にコンパイルすれば long が64ビットになる
959デフォルトの名無しさん:2008/07/02(水) 00:43:43
x64は64bitレジスタをいじる命令が32bitレジスタをいじる命令より1バイト長い
という食わせ物だから。intまで64bitにしたくないのはわかる。
960デフォルトの名無しさん:2008/07/02(水) 01:41:41
Win16のときのlong=32bitのまま引きずってるから、longを64bitに
できなかったんだろうな。
Win32ではintでいいところでlongを多用してるし。

まぁ、16bit時代から互換性を重視しながら続いているのが原因で、
しょうがないとは思う。生まれたときから32bitのOSとは事情が違うでしょ。

どうせtypedefされた型名しか使わないから、どこかの時点でlongを
使っている部分をintに変えてもよかった気はするけどね。
961デフォルトの名無しさん:2008/07/02(水) 01:50:54
long long
どっかの南の島の爺さんが語る昔話の話し出しみたいな
ろぉんぐ、ろぉんぐ、あるところに・・
962デフォルトの名無しさん:2008/07/02(水) 02:07:32
API自体が使うのはLONGとかDWORDとかINT_PTRとかなんだから、
別にCのlongが64bitだろうが行けなくはないはずなんだがなー
963デフォルトの名無しさん:2008/07/02(水) 05:03:19
Linux(笑)
964955:2008/07/02(水) 07:26:01
>>956
32ビット環境でlongが64ビットの例が欲しかったのだが・・・。JavaとかC#みたいな。
>>957
Alphaは大昔に使ったけどintは32では?
965デフォルトの名無しさん:2008/07/02(水) 09:56:17
初心者ですが、32bit Windows環境だと
単なる "unsigned宣言" は "unsigned long宣言" と同義ということですか?
966デフォルトの名無しさん:2008/07/02(水) 10:06:25
言語的には unsigned は unsigned int と同義。

で long がたまたま int と同じ長さだと、そうなる。
967デフォルトの名無しさん:2008/07/02(水) 13:06:30
SGIのにILP64なのがあったはず。AlphaはLP64でしょ。
968デフォルトの名無しさん:2008/07/02(水) 14:00:58
>>962
API自体のインターフェースが変わっている罠。
DWORDを受けていたのにULONG_PTRに変わったこれとか。
http://msdn.microsoft.com/ja-jp/library/cc429342.aspx
969デフォルトの名無しさん:2008/07/02(水) 20:49:14
同義じゃないだろ。
unsigned i1;
unsigned long i2;
std::printf("%s\n", typeid(i1).name());
std::printf("%s\n", typeid(i2).name());
i1とi2は「サイズが同じ」だけで同義じゃない。

あと『単なる "unsigned宣言"』という前提から少し外れるが、ポインタの互換性はない。
typedef unsigned long t1;
typedef unsigned t2;
t2 *p = (t1 *)0; // compile error
970デフォルトの名無しさん:2008/07/02(水) 22:39:04
同じ働きをすると言ってるだけで、誰も同じ型だとは言ってないよ。
971デフォルトの名無しさん:2008/07/02(水) 23:27:20
整数の型を省略したらsigned, intが勝手に着くとかあったなぁ
972デフォルトの名無しさん:2008/07/02(水) 23:28:02
main(c, char **s){
}
973デフォルトの名無しさん:2008/07/02(水) 23:35:36
最近は省略してもintと解釈しなくなったんじゃなかったっけ
974969:2008/07/03(木) 07:28:22
>>970
その「同じ働き」ってのが曖昧じゃないか。typeid比較する
コードがあったら違う挙動になるのは同じ働きとはいえないだろ。
サイズが同じだけで別の型だって念を押しておかないと>>965
unsignedとunsigned longの入り交じったソース量産するぞ。
975デフォルトの名無しさん:2008/07/03(木) 07:46:53
976デフォルトの名無しさん:2008/07/04(金) 07:35:27
posixのスレッドローカルデータって
上限値って決まってるのでしょうか
977デフォルトの名無しさん:2008/07/04(金) 08:44:28
データの個数?総サイズ?
978デフォルトの名無しさん:2008/07/04(金) 11:28:41
サイズなら上限は当然あるだろ
数値は実装に依存するが
979デフォルトの名無しさん:2008/07/04(金) 23:44:41
>>974
int a;
int b;

a と b のアドレスを比較するコードがあったら違う挙動になるんですが、
a と b は違う働きをするんですか?
980デフォルトの名無しさん:2008/07/04(金) 23:46:48
>>977
スタックサイズが64kbか128kbなので
個別スレッドで4Mのデータを扱えません
981デフォルトの名無しさん:2008/07/05(土) 01:02:35
>>980
なんで全てのデータをスタックに入れようとするんだよ。
982デフォルトの名無しさん:2008/07/05(土) 01:04:57
>>981
入れたいの
983デフォルトの名無しさん:2008/07/05(土) 06:46:06
>>979
違うとえば違うような。変数と型を一緒にしてない?
984デフォルトの名無しさん:2008/07/05(土) 07:06:39
>>980
回避方法はあるけど、TLSを使わない方針で設計を見直すべき。
985デフォルトの名無しさん:2008/07/05(土) 07:14:18
>>984
じゃあ使わないからどうやればいいのか教えてください
986デフォルトの名無しさん:2008/07/05(土) 09:13:34
スレッドごとにメモリを動的確保すればよい。メモリの解放には注意して。
987デフォルトの名無しさん:2008/07/05(土) 09:53:45
>>985
使わなくてもいい方法を一度考えてから質問しようぜ
988デフォルトの名無しさん:2008/07/05(土) 10:06:30
>>987
mutexしたくないので使わないと無理です
989デフォルトの名無しさん:2008/07/05(土) 10:30:30
まさか、グローバル変数だけで作ってるのか?
990デフォルトの名無しさん:2008/07/05(土) 10:43:59
うん
991デフォルトの名無しさん:2008/07/05(土) 10:44:54
>>990
NT系列のコーディング規約でそうなってるの
どうすればいいの?
992デフォルトの名無しさん:2008/07/05(土) 11:44:32
グローバル変数の使用が強制されたコーディング規則だと・・・

もちろん釣りだよな。
993デフォルトの名無しさん:2008/07/05(土) 11:46:05
今人気急上昇中の組み込み系かもしれない
994デフォルトの名無しさん:2008/07/05(土) 11:54:24
>>992
いやまじなんですよ本当に
コーディングルールの
項4.5.1に、共有データはグローバル変数として
定義し他者が利用しやすいように記述すること
って載ってるんですよ

本当に助けてくださいまじで困ってます。
もう吊ろうかな3日も寝てなくて頭おかしくなってきたし
995デフォルトの名無しさん:2008/07/05(土) 12:11:23
>>994
TLSにデータを置いたら、他のスレッドからアクセスできなくなるから共有にならないけどいいの?
996デフォルトの名無しさん:2008/07/05(土) 12:14:24
>994
共有データって書いてあるじゃん。
共有データじゃないものには適用するな。
997デフォルトの名無しさん:2008/07/05(土) 12:23:00
>>994
今やってるところは個別のスレッドで
データ作って処理するところなんですよ
規約でグローバル変数は共有する場合だけ
だから使うなって言われたけどどうすればいいか
わからないし

998デフォルトの名無しさん:2008/07/05(土) 12:30:35
>>997
使うなっていわれたんだから使わないでOK
グローバル変数は使わないのが正道
999デフォルトの名無しさん:2008/07/05(土) 12:37:26
>>997
個別のスレッドでデータ造って処理するんだから、他のスレッドと
共有なんかしなくていいんだろ。

だから、グローバルを使わなくていいんだし、素直に >>986 でい
いだろ。

スレッドローカルデータがどうのこうのの前に、日本語理解力と
コミュニケーション能力を何とかした方がいいと思うよ。
1000デフォルトの名無しさん:2008/07/05(土) 12:40:07
時間切れとなりました
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。