- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在调用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/
我是一名优秀的程序员,十分优秀!