gpt4 book ai didi

c - pthread 指针数组

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:18 25 4
gpt4 key购买 nike

我对一组 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); 中这些指针的操作顺序感到困惑。我会进一步研究。

最佳答案

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]. */

关于c - pthread 指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11317793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com