如何在pthread_attr_t上获得分离状态?

时间:2019-07-08 15:01:41

标签: c pthreads

我正在研究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

1 个答案:

答案 0 :(得分:4)

您正在使用glibc,而不是与pdate链接,从而在sum中获得了imp的虚拟无操作版本。这是glibc中一大堆长期未解决的问题的一部分,其中包含许多pthread函数。虚拟副本在那里,因此可以在不依赖weighted_mean的情况下链接“不使用线程”的程序,但这会导致严重的破坏和像您看到的那样最少的违规行为。 >

在链接命令行的末尾添加imp,您应该获得正确的输出。