0

私はpthreadポインタの配列に打たれました。各スレッドは、異なるデータストリームを読み取ることを目的としています

typedef struct {
  // ...other stuff
  pthread_t *threads[MAX_STREAM_COUNT];
} stream_manager;

そして、私が読み始めたいとき:

void start_reading(stream_manager *sm, int i) {
   // do some pre processing stuff
   pthread_create( (pthread*) &sm->threads[i], 
                              NULL, 
                              read_stream_cb, 
                      (void*) sm->streams[i]       );
}

読むのをやめたいとき:

void stop_reading(stream_manager *sm, int i) {
   iret = pthread_join(*sm->threads[i], NULL);
   if(iret != 0) {
     perror("pthread_join returned with error:: ");
     printf( "pthread_join returned with error:: %s\n", strerror(iret) )
   }
}

今のところ、私のread_stream_cb関数は、読み取り元のストリームの名前を出力するだけです。

void* read_stream_cb(stream *strm) {
   stream *s = (stream*) strm;
   prinf("%s\n", s->name);
}

メインプログラムでは、2つのストリームを異なる名前で初期化します。run start_reading()、sleep(3)、stop_reading())を呼び出します。プログラムはストリーム名を3秒間正常に出力しますが、pthread_joinは正常に返されません。戻っ3て印刷します

pthread join error: Operation timed out
pthread_join returned with errer:: No such process

これはポインタの問題かもしれないと思いますか?結合内のこれらのポインターを使用した操作の順序と混同される可能性がありますpthread_join(*sm->streams[i], NULL);。それについてもっと調べます。

4

1 に答える 1

3

pthread_create()pthread_t*引数としてaを取り、これはpthread_t**:を渡します。

pthread_create( (pthread*) &sm->threads[i],

sm->threadsの配列も同様ですpthread_t*。次のように変更stream_managerします。

typedef struct {
  // ...other stuff
  pthread_t threads[MAX_STREAM_COUNT]; /* No longer array of pointers. */
} stream_manager;

の呼び出しから不要なキャストを削除しpthread_create()ます。

pthread_join()を取るpthread_t

pthread_join(sm->threads[i]); /* Not sm->streams[i]. */
于 2012-07-03T19:32:02.260 に答える