我正在研究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之后,一切都解决了(如https://stackoverflow.com/a/56938217/2903371中所建议)。仅出于记录目的,我想显示新的打印输出,该打印输出显示不同的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
答案 0 :(得分:4)
您正在使用glibc,而不是与pdate
链接,从而在sum
中获得了imp
的虚拟无操作版本。这是glibc中一大堆长期未解决的问题的一部分,其中包含许多pthread函数。虚拟副本在那里,因此可以在不依赖weighted_mean
的情况下链接“不使用线程”的程序,但这会导致严重的破坏和像您看到的那样最少的违规行为。 >
在链接命令行的末尾添加imp
,您应该获得正确的输出。