Как я могу получить detachstate на pthread_attr_t? - PullRequest
2 голосов
/ 08 июля 2019

Я смотрю на поведение 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

1 Ответ

4 голосов
/ 08 июля 2019

Вы используете glibc, не связываетесь с -lpthread, и, таким образом, получаете фиктивную безоперационную версию pthread_attr_getdetachstate в libc.so.Это часть большого семейства давно не исправленных проблем в glibc со множеством функций pthread.Имеются фиктивные копии, так что программы, которые «не используют потоки», могут быть связаны без зависимости от libpthread.so, но это приводит к действительно серьезным поломкам и нарушениям с наименьшим количеством неожиданностей, таким как вы видите.

Добавьте -lpthread в конец командной строки связывания, и вы должны получить правильный вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...