如何在 pthread_attr_t 上获得分离状态?
How can I get detachstate on pthread_attr_t?
我正在调查 pthread_attr_t 上的行为,因此在尝试获取分离状态时遇到了一些奇怪的情况。按照此处的示例,但输出与预期不同。
https://users.cs.cf.ac.uk/Dave.Marshall/C/node30.html
为此,我尝试使用 pthread_attr_getdetachstate。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
int main(int argc, char **argv) {
int detachstate1=37; //Magic number to recognize output
int detachstate2=38; //Magic number to recognize output
pthread_attr_t attr1;
pthread_attr_t attr2;
printf("init: %d\n", pthread_attr_init(&attr1));
printf("PTHREAD_CREATE_DETACHED: %d\n", PTHREAD_CREATE_DETACHED);
printf("getdetachstate: %d\n", pthread_attr_getdetachstate(&attr1, &detachstate1));
printf("detach 1 before: %d\n", detachstate1);
pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED);
pthread_attr_getdetachstate(&attr1, &detachstate1);
printf("detach 1 after: %d\n", detachstate1);
pthread_attr_init(&attr2);
pthread_attr_getdetachstate(&attr2, &detachstate2);
printf("detach 2: %d\n", detachstate2);
}
输出看起来像,
host:~/c_examples$ gcc threads.c -o threads
host:~/c_examples$ ./threads
init: 0
PTHREAD_CREATE_DETACHED: 1
getdetachstate: 0
detach 1 before: 37 // Expected 0 for joinable
detach 1 after: 37 // Expected 1 for detached
detach 2: 38 // Expected 0 or 1, depending on if there is a global dependency between attr1 and attr2.
host:~/c_examples$
我想测试这个的原因是测试是否可以有多个 pthread_attr_t(或者 pthread_attr_t 是否有一些全局依赖),但我最终得到了一个相反,奇怪的取消引用问题。有什么想法吗?
BR
帕特里克
编辑
将 -lpthread 标志添加到 gcc 后,一切正常(如 中所建议)。仅作为记录,我想显示新的打印输出,它表明不同 pthread_attr_t、
之间没有全局依赖关系
host:~/c_examples$ gcc threads.c -o threads -lpthread
host:~/c_examples$ ./threads
init: 0
PTHREAD_CREATE_DETACHED: 1
getdetachstate: 0
detach 1 before: 0
detach 1 after: 1
detach 2: 0
您正在使用 glibc,而不是与 -lpthread
链接,因此在 libc.so
中获得了 pthread_attr_getdetachstate
的虚拟 no-op 版本。这是 glibc 中具有大量 pthread 函数的 long-unfixed 问题大家族的一部分。虚拟副本在那里,因此可以链接 "don't use threads" 的程序而不依赖于 libpthread.so
,但它会导致非常严重的破坏和 least-surprise 违规行为,就像您所看到的那样。
将 -lpthread
添加到链接命令行的末尾,您应该会得到正确的输出。
我正在调查 pthread_attr_t 上的行为,因此在尝试获取分离状态时遇到了一些奇怪的情况。按照此处的示例,但输出与预期不同。
https://users.cs.cf.ac.uk/Dave.Marshall/C/node30.html
为此,我尝试使用 pthread_attr_getdetachstate。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
int main(int argc, char **argv) {
int detachstate1=37; //Magic number to recognize output
int detachstate2=38; //Magic number to recognize output
pthread_attr_t attr1;
pthread_attr_t attr2;
printf("init: %d\n", pthread_attr_init(&attr1));
printf("PTHREAD_CREATE_DETACHED: %d\n", PTHREAD_CREATE_DETACHED);
printf("getdetachstate: %d\n", pthread_attr_getdetachstate(&attr1, &detachstate1));
printf("detach 1 before: %d\n", detachstate1);
pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED);
pthread_attr_getdetachstate(&attr1, &detachstate1);
printf("detach 1 after: %d\n", detachstate1);
pthread_attr_init(&attr2);
pthread_attr_getdetachstate(&attr2, &detachstate2);
printf("detach 2: %d\n", detachstate2);
}
输出看起来像,
host:~/c_examples$ gcc threads.c -o threads
host:~/c_examples$ ./threads
init: 0
PTHREAD_CREATE_DETACHED: 1
getdetachstate: 0
detach 1 before: 37 // Expected 0 for joinable
detach 1 after: 37 // Expected 1 for detached
detach 2: 38 // Expected 0 or 1, depending on if there is a global dependency between attr1 and attr2.
host:~/c_examples$
我想测试这个的原因是测试是否可以有多个 pthread_attr_t(或者 pthread_attr_t 是否有一些全局依赖),但我最终得到了一个相反,奇怪的取消引用问题。有什么想法吗?
BR 帕特里克
编辑
将 -lpthread 标志添加到 gcc 后,一切正常(如
host:~/c_examples$ gcc threads.c -o threads -lpthread
host:~/c_examples$ ./threads
init: 0
PTHREAD_CREATE_DETACHED: 1
getdetachstate: 0
detach 1 before: 0
detach 1 after: 1
detach 2: 0
您正在使用 glibc,而不是与 -lpthread
链接,因此在 libc.so
中获得了 pthread_attr_getdetachstate
的虚拟 no-op 版本。这是 glibc 中具有大量 pthread 函数的 long-unfixed 问题大家族的一部分。虚拟副本在那里,因此可以链接 "don't use threads" 的程序而不依赖于 libpthread.so
,但它会导致非常严重的破坏和 least-surprise 违规行为,就像您所看到的那样。
将 -lpthread
添加到链接命令行的末尾,您应该会得到正确的输出。