我遇到了一系列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);
中这些指针的操作顺序感到困惑。我会再研究一下。
答案 0 :(得分:3)
pthread_create()
以pthread_t*
为参数,传递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]. */