0

重複の可能性:
Linuxでのpthread_createへの未定義の参照(cプログラミング)

UbuntuのCでスレッドチェーンを実装しようとしています。次のコードをコンパイルすると、ヘッダーファイルを追加したにもかかわらず、これらのスレッドライブラリ関数への未定義の参照のエラーが発生します。セグメンテーション違反エラーも発生します。何故ですか?プログラムのどこにも初期化されていないメモリにアクセスしていません。コードは次のとおりです。

#include <stdio.h>
#include<stdlib.h>
#include <pthread.h>

void* CreateChain(int*);

 int main()
{
int num;

pthread_t tid;


scanf("Enter the number of threads to create\n %d",&num);

pthread_create(&tid,NULL,CreateChain,&num);

pthread_join(tid,NULL);

printf("Thread No. %d is terminated\n",num);

return 0;
}

void* CreateChain(int* num )
 {
pthread_t tid;

if(num>0)
{
    pthread(&tid,NULL,CreateChain,num);
    pthread_join(tid,NULL);

    printf("Thread No. %d is terminated\n",*num);
}
else
    return NULL; 

return NULL;
}

次の警告が表示されますが、何らかの理由でScanfプロンプトが表示されません。

ここに画像の説明を入力してください

よろしく

4

3 に答える 3

2

pthread.hヘッダーファイルは、pthread関数の前方宣言を提供します。これは、これらの関数が存在し、特定のシグネチャを持っていることをコンパイラに通知します。ただし、実行時にこれらの関数がどこにあるかについては、リンカには何も通知されません。

リンカがこれらの呼び出しを解決できるようにするには(コード内または別の共有オブジェクト内のどこにジャンプするかを決定します)、次を追加して適切な(pthread)ライブラリにリンクする必要があります。

-pthread

ビルドコマンドラインに。

[を使用することも可能であることに注意してください-lpthreadこの前の質問は、なぜ-pthread好ましいのかを説明しています。]

注目に値するコードには他にもさまざまな問題があります

  • ユーザープロンプトを表示するには、行scanfを分割する必要がありますprintf("Enter number of threads\n");scanf("%d", &num);
  • の署名が間違っています-代わりに引数CreateChainを取る必要があります。void*関数内のようなことをいつでも実行してint num = *(int*)arg;、スレッドの数を取得できます。
  • 内部のロジックCreateChainが間違っているように見えます。現在、ポインタを0と比較しています-代わりにスレッドの数を比較するつもりですか?また、どこかに作成するスレッドの数をデクリメントしないと、スレッドを永久に作成するコードになってしまいます(または、さまざまなスレッドのスケジュール方法によってはハンドルがなくなるまで)。
于 2012-12-04T15:44:16.113 に答える
1

以下のようにコンパイルしてみてください:

gcc -Wall -pthread test.c -o test.out

-pthreadに関連するシンボルを解決するようにリンカに明示的に指示するオプションです。<pthread.h>

于 2012-12-04T15:44:24.147 に答える
0

追加-lpthread

gcc -o test test.c -lpthread
于 2012-12-04T15:45:58.097 に答える