1

以下の私の擬似コードを参照してください。コードコメントは私の問題を説明するはずです。私はCのpthreadとリンクリストの両方に慣れていないので、少し深いところに飛び込みました。str関数にoutの値を出力する必要がありthread_workます。コードのシーケンシャルビットは問題ありませんが、各スレッドが機能する場合、の値を出力できませんstr

// linked list definition
struct linked_list {
   char *str;
   struct linked_list *next;
};

// linked list initiation
struct linked_list *root;
struct linked_list *next_info;
root = malloc( sizeof( struct linked_list ) );

// main code
some loop {
   next_node->str = str;
   printf( "%s\n", next_node ); // PRINTS FINE
   pthread_t thread;
   rc = pthread_create( &thread, NULL, thread_work, (void *) &next_node );
   next_node->next = malloc( sizeof( struct linked_list ) );
   next_node = next_node->next;
}

// code executed by each thread
void *thread_work( void *thread_arg ) {
   struct linked_list *ll;
   ll = ( struct linked_list * )thread_arg;
   printf( "%s\n", ll->str ); // PRINTS SOME MESS (��E#)
}

私の実際のコードには、のメンバーがさらにいくつかありますlinked_list struct

どうもありがとう。

4

3 に答える 3

2

ポインター型の不一致があります。ポインターをリスト ノードへのポインターに渡していますが、内部で thread_workはそれをノードへのポインターとして扱います。next_nodeへの呼び出しの前にあるアンパサンドを削除するか、次のようpthread_createに変更します。thread_work

void *thread_work( void *thread_arg ) {
    struct linked_list **llp, *ll;
    llp = ( struct linked_list ** )thread_arg;
    ll = *llp;
    printf( "%s\n", ll->str ); // PRINTS SOME GOOD STUFF
}
于 2012-07-03T11:08:47.003 に答える
0

このコードは悪いです:

// main code
some loop {
  next_node->str = str;
  printf( "%s\n", next_node ); // PRINTS FINE
  pthread_t thread;
  rc = pthread_create( &thread, NULL, thread_work, (void *) &next_node );
  next_node->next = malloc( sizeof( struct linked_list ) );
  next_node = next_node->next;
}

ここでの問題は、の呼び出しの直後に値が変化する変数へのポインターを渡していることですpthread_create。OSがプロセスを新しいスレッドに複製するのに時間がかかるため、ステートメントが実行されthread_workた後に実際に開始され、間違った値の.を選択する可能性があります(ほとんどの場合はそうなります)。アドレスではなく、の値を渡す必要があります。next_node = next_node->next;next_nodenext_node

// main code
some loop {
  next_node->str = str;
  printf( "%s\n", next_node->str ); // PRINTS FINE
  pthread_t thread;
  rc = pthread_create( &thread, NULL, thread_work, (void *) next_node );
  // Store this thread handle somewhere safe to be able to join the thread later on
  next_node->next = malloc( sizeof( struct linked_list ) );
  next_node->next->str = next_node->next->next = NULL; // Always a good idea
  next_node = next_node->next;
}
于 2012-07-03T11:47:10.240 に答える
0

正常に動作する場合printf( "%s\n", next_node )next_nodeはポインターであるため、pthread_create()でポインターを指すべきではありません。next_nodeの定義がいいでしょう ;)

試すrc = pthread_create( &thread, NULL, thread_work, (void *) next_node );

于 2012-07-03T11:10:02.520 に答える