1

スレッドに問題があります。

グローバル変数、NULL に初期化する char *、およびミューテックスを定義しています。

pthread_mutex_t mutex;
char *minURLTime;
minURLTime = NULL;

次に、ミューテックスを初期化します。

pthread_mutex_init(&mutex, NULL);

次に、新しいスレッドを作成します。

void *status;
pthread_t t;
pthread_create(&t, NULL, executeThread, (void *) &val);
pthread_join(t, &status);

その関数内で、strdup を使用して minURLTime にスペースを割り当て、リンクから文字列をコピーします。

pthread_mutex_lock(&mutex); 
minURLTime = strdup(link);
pthread_mutex_unlock(&mutex);  

(malloc を呼び出す strdup を介して) ヒープを使用しているため、スレッドが終了するまで minURLTime が NULL にならない理由がわかりませんが、その後は NULL になります。

pthread_exit(NULL);

pthread_exit が呼び出されると、minURLTime は strdup (malloc を呼び出す) によって割り当てられたグローバル変数ですが、NULL のように見えます。わかりません 誰か説明してくれませんか?

どうもありがとうございました、

編集:

もう少し詳しく。

main() から:

void *status;
pthread_t t;

pthread_create(&t, NULL, executeThread, (void *) &val);
pthread_join(t, &status);

ExecuteThread 関数:

void *
executeThread( void *val )
{
  executeRequest(*((int *) val));
  if (minURLTime != NULL) {
    pthread_mutex_lock(&mutex); 
    fprintf(stderr, "\nURL AFTER THREAD ( BEFORE EXIT ): %s\n", minURLTime); // Not executed
    pthread_mutex_unlock(&mutex); 
  }
  pthread_exit(NULL);
}

fprintf は実行されません (pthread_exit を返す前)。

executeRequest 関数:

void
executeRequest( int val )
{
  /* some code */

  pthread_mutex_lock(&mutex); 
  minURLTime = strdup(link);
  pthread_mutex_unlock(&mutex);  

  if (minURLTime != NULL) {
    pthread_mutex_lock(&mutex); 
    fprintf(stderr, "\nURL: %s\n", minURLTime); // This one DOES print
    pthread_mutex_unlock(&mutex); 
  }
}

これは役に立つかもしれません。スレッドが終了する前に、executeRequest 内では出力されますが、executeThread 内では出力されません。

ジャリー

4

2 に答える 2

1

新しいスレッドが完了するのをメイン スレッドで待機していないため、スレッドが別の設定を行う前に null が表示されます。また、変数をロックで保護していないか、変数を揮発性として宣言していないため、コンパイラは、スレッドが変数を変更したことに気付いて最適化することさえできます。

于 2010-10-16T01:35:43.683 に答える
0

私の謝罪、私は問題が何であったかを理解しています.executeRequest内の何かがそれらの変数を台無しにしていました.メモリのその部分を正確に上書きする方法は本当にわかりませんが、修正されました. ありがとうございます!

于 2010-10-16T02:17:46.480 に答える