gpt4 book ai didi

c - pthread_create写回的时机

转载 作者:行者123 更新时间:2023-11-30 14:28:18 25 4
gpt4 key购买 nike

在调用pthread_create(&id, NULL, &start_routine, arg)中,线程id是否保证在start_routine开始运行之前写入id?联机帮助页清楚地表明,start_routine 可能但不一定会在 pthread_create 调用返回之前开始执行,但是当线程 id 写回到传递的线程参数时,它们却保持沉默。

我的具体情况是我有一个 pthread_create 包装器:

int mk_thread(pthread_t *id) {
pthread_t tid;
pthread_create(&tid,NULL,ThreadStart,NULL);
if (id == NULL) {
pthread_detach(tid);
} else {
*id=lid;
}
}

这显然可以在写回之前运行启动例程。我把它改成了

int mk_thread(pthread_t *id) {
pthread_t tid,tidPtr=id?id:&tid;
pthread_create(tidPtr,NULL,ThreadStart,NULL);
if (id == NULL) {
pthread_detach(tid);
}
}

这种重写在实践中更加稳定,但它实际上是修复还是只是竞争条件的较小窗口?

最佳答案

线程ID肯定是在pthread_create返回之前写入的。如果您考虑一下,pthread_create 不可能以任何其他方式工作。它无法将线程 ID 的写入委托(delegate)给新线程,因为在新线程运行时 pthread_t 变量可能超出范围。

相关文字是:

Upon successful completion, pthread_create() shall store the ID of the created thread in the location referenced by thread.

(来自 http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_create.html )请注意,它说的是函数的“成功完成时”,而不是“成功完成后的不确定时间”。

更有趣的问题,我对此不太清楚,是 pthread_create 是否必须在新线程启动函数开始之前完成将线程 id 写入其目的地,即新线程是否可以立即看到它自己的线程ID,例如如果要存储在全局变量中。我怀疑答案是否定的。

编辑:重新阅读您的问题后,您似乎确实在问后一个更有趣的问题。无论如何,新线程的启动函数没有理由使用 pthread_create 写出的线程 ID。您的新线程可以(并且应该)只使用 pthread_self 来获取自己的线程 ID。

关于c - pthread_create写回的时机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6338775/

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