0

私のプロジェクトでは、テキストファイルに文字列を追加して機能するかどうかをテストするだけのスレッドを作成したいと考えています。Ubuntu 12.04 で IDE Eclipse Juno を使用しています。私のコードの一部は次のとおりです。

pthread_t processThread;
threadData * thData = new threadData;
int t = pthread_create(&processThread, NULL, 
                       BufferedData::processData, (void *)thData);

ここで、threadData は、スレッドのパラメーターを持つ構造体です。クラス BufferedData のスレッド開始メンバー関数なので、processData メソッドは静的です。その宣言は次のとおりです。

static void * processData(void * arg);

コードのこの部分の後、t 値 (pthread_create の戻り値) をチェックします。毎回0なので、スレッドの開始は成功したと思います。しかし、それでも何もしません - 文字列をファイルに追加しません。関数 processData が何をするかは問題ではありません: ファイルへの文字列の追加、例外のスロー、cout への書き込みなど。毎回何もしません。

私は経験豊富な C++ プログラマーではないので、問題を解決するために何を確認、編集、または実行すればよいかわかりません。IDE は、何かが間違っているという応答を返してくれません。すべてが問題ないように見えます。

回答ありがとうございます。

編集: processData 関数のコード:

void * BufferedData::processData(void * arg) {
HelperFunctions h;
h.appendToFile("log", "test");
    return 0;
}

appendToFile メソッドは、文字列 "test" をファイル "log" に書き込みます。これは他のプロジェクトでテストされており、機能します。

4

1 に答える 1

0

これで、スレッドは(無限ではなく)時間内に終了するため、次のことが役立ちます。

int pthread_join(pthread_t thread, void **status);

以下codeでは、スレッドが作成されたときに、pthread_join関数がスレッドからの戻りを待っています。この状態では、キーワードのpthread_exit()代わりに of を使用します。return

これを試してくださいpthread_join()

void *ret;
pthread_t processThread;
threadData * thData = new threadData;
int t = pthread_create(&processThread, NULL, 
                       BufferedData::processData, (void *)thData);

if (pthread_join(processThread, &ret) != 0) {
    perror("pthread_create() error");
    exit(3);
  }

   delete ret;      // dont forget to delete ret (avoiding of memory leak)

そしての使用pthread_exit()

void * BufferedData::processData(void * arg) {
int *r = new int(10);
HelperFunctions h;
h.appendToFile("log", "test");
    pthread_exit(static_cast<void*>(a));
}

概要

呼び出しthreadがターゲットの終了を待機できるようにしthreadます。

pthread_tスレッドを一意に識別するために使用されるデータ型です。pthread_create()これは、スレッド ID を必要とする関数呼び出しでアプリケーションによって返され、使用されます。

status には、終了スレッドによって の一部として渡される status 引数へのポインタが含まれますpthread_exit()。終了スレッドがリターンで終了した場合、status にはreturn値へのポインターが含まれます。スレッドがキャンセルされた場合、ステータスを に設定できます-1

戻り値

成功した場合は、 をpthread_join()返します0。失敗した場合は、pthread_join()返されて次のいずれかの値に-1設定されます。errno

エラーCode:

Description :

EDEADLK
    A deadlock has been detected. This can occur if the target is directly or indirectly joined to the current thread.
EINVAL
    The value specified by thread is not valid.
ESRCH
    The value specified by thread does not refer to an undetached thread.

ノート:

正常にpthread_join()戻ると、対象のスレッドは切り離されています。複数のスレッドを使用pthread_join()して、同じターゲット スレッドが終了するのを待機することはできません。別のスレッドが同じターゲット スレッドに対してpthread_join()正常に発行した後に、あるスレッドがターゲット スレッドに対して発行した場合、2 番目のスレッドは失敗します。pthread_join()pthread_join()

スレッドの呼び出しpthread_join()がキャンセルされた場合、対象のスレッドは切り離されません

于 2018-07-03T02:57:27.030 に答える