2016-10-16 14 views
-1
int err = pthread_create(&p, NULL, pro, (void*)1); 

私はプログラムを実行するたびに、セグメンテーションフォルトを取得しています。そのことについて読んで、スレッドが読み込みしようとしていることを理解しています。私はエラーを見つけるためにコードを調べましたが、私はCとうまく動作するデバッガを持っていないので、苦労しています。セグメンテーションのデフォルト(コアダンプ)

誰かがこの問題を手伝ってくれますか?

答えて

2

GDBを使用すると(プログラムを使用する必要があります)、プログラムがクラッシュすると良い情報が得られます。

ファーストは次にGDB内部でそれを実行する "-g"

gcc file.c -lpthread -g 

してプログラムをビルドします。

あなたはこの表示されます。有罪のラインがあることはかなり明白である。そこから

Thread 2 "a.out" received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0x7ffff781e700 (LWP 8082)] 
0x0000000000400b94 in produce (arg=0x1) at test.c:84 
84  int id = *(int*) arg; 

を:

int id = *(int*) arg; 

はあなたがここでやっている正確に何を見てみましょう:

あなたが欲しいですそのパラメータを使用できるようにします。正しい ...

しかし、あなたの関数にパラメータを渡す方法を見て:あなたは値「1」を取り、void *に、それをキャストしている

int err = pthread_create(&producer_thread1, NULL, produce, (void*)1); 

。なぜか...たとえ本当に特別な場合を除いてそれをやりたいとは思っていないにしても...しかしあなたの特定のケースでは、それはあなたが望むものではないのです、なぜですか?

プロダクション関数の中ではintとへのポインタだと思いますが、そうではありません!あなたのシステムでは、私は64ビットで書かれた値(1)にキャストされていますが、それはまだ1です。したがって、逆参照しようとすると、セグメンテーションが発生します失敗。

int err = pthread_create(&producer_thread1, NULL, produce, (void*)1); 

になるでしょう(それらのすべて)

EDITを変数としてthoose値を宣言し、pthread_createの関数に自分のアドレスを渡してみてください。

int err = pthread_create(&producer_thread1, NULL, produce, (void*)&one); 

どこ変数を"one"は次のようなグローバル変数です:

int one = 1; 

しかし、それはあなたが選択したアドレスを持つintまたは任意のintに割り当てられている可能性もあります。単にNOTの値を渡してアドレス指定し、そのまま扱います。

これは役に立ちます。

+0

メインと他のほとんどの部分の中のすべてが教授によって私に与えられ、内部で何も変更しないように言われました。私は 'void * produce(void * arg)'と 'void * consume(void * arg)'のみを変更することが許されています。ターミナルには、エラーがpthread_createと関係があることが記載されていました!私のクラスメートの中には、それらのエラーのいずれかを得られなかったと言った人もいました! – ben

+0

argをlong long intにキャストしようとすることはできますが、これはpthead_createにどのようにパラメータを渡すかではありません。私がここであなたに与えているオリジナルのコードと「テクニック」は、あなたのユースケースでは悪いです。あなたはエラーと読みにくいコードを取得します。しかし、あなたも先生のために持っていれば。 –

+1

@HectorRoussille私はcreate_thread関数を変更しようとしています。だから、あなたが私に言っていることを明確にするために、 '(void *)1'を変数に変更したいと思っています。例えば、 'int a = 1;' 'そして' create_thread(...(void *)(intptr_t)a; 'の内部にありますか? – ben

関連する問題