2011-12-31 6 views
0

なんらかの理由でpthread_createは、structを引数として渡すことを許可していません。問題はシステムに関連していませんが、他の誰かの箱でテストする機会はありませんでした。何らかの理由でstructを渡すことはできません。エラー#12を返します。なぜpthread_create()は12を返しますか?

メモリに問題がありません。私は12がENOMEMであることを知っています、そして、 "それはそうすべき"ですが、そうではありません。単純に私の構造体をポインタとして受け入れないでしょう。私はGDBにこのコードを実行したとき

struct mystruct info;  
info.website = website; 
info.file = file; 
info.type = type; 
info.timez = timez; 
for(threadid = 0; threadid < thread_c; threadid++) 
    { 
    // printf("Creating #%ld..\n", threadid); 
    retcode = pthread_create(&threads[threadid], NULL, getstuff, (void *) &info); 
    //void * getstuff(void *threadid); 

は、何らかの理由で、それはコード12が返されませんでした..しかし、私は、コマンドラインから実行するとき、それは12

任意のアイデアを返しますか? Linux上

+0

スレッドルーチン 'getstuff()'への引数は、その引数が 'threadid'であるというあなたのコメントにもかかわらず、スレッドIDではない '&info'へのポインタです。あなたはおそらくこれを認識していますが、二重のチェックだけです。 –

+0

'info'のアドレスの代わりにヌルポインタを渡したとします。 'info'をグローバル変数にすることができます。というのも、スレッドはすべて同じ情報を使用するからです。スレッドのどれでも変更しないでください。あなたはまだメモリの問題にぶつかっていますか?任意のファイルまたは共有メモリセグメントを任意の場所にマップしましたか?あなたは32ビットまたは64ビットプラットフォーム(コンパイル)で作業していますか? 'pthread_create()'の第2引数のスレッド属性をいくつか作成しようとしましたか? –

答えて

6

エラーコード12:

#define ENOMEM   12  /* Out of memory */ 

あなたはおそらく、メモリが不足しています。あまりにも多くのスレッドを割り当てていないことを確認し、完了したらpthread_joinスレッドにしてください(またはpthread_detachを使用してください)。あなたは他の方法でもあなたの記憶を使い果たしていないことを確認してください。

+0

un-freed malloc()..ありがとう、スレッドをデバッグしませんでした。 – Saustin

2

pthread_createへのパラメータとしてスタックオブジェクトを渡すことは、かなり悪い考えです。私はヒープ上にそれを割り当てます。エラー12はENOMEMです。

+0

mallocを使って割り当てを試みましたが、それでも12が返されました。ポインタを使用するための正しい変更を適用した後も、それは同じ影響を受けていました..そのように、それは型キャストされた長いptrs – Saustin

1

適切なエラー処理を追加してください。

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
static void fail(const char *what, int code) 
{ 
    fprintf(stderr, "%s: %s\n", what, strerror(code)); 
    abort(); 
} 

... 
if (retcode) 
    fail("pthread_create", retcode); 

私のシステムでは、12はENOMEM(メモリ不足)です。

関連する問題