Я смотрю на поведение 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
Patrik
EDIT
После добавления флага -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