Законно ли вызывать функции pthread для thrd_t? - PullRequest
3 голосов
/ 06 ноября 2019

Поддержка C11 для потоков - это нормально, но не исчерпывающе. В случае, если мне нужно использовать функции pthread, я хотел бы понять, допустимо ли приводить thrd_t к pthread_t. Например:

#include <threads.h>
#define_GNU_SOURCE
#include <pthread.h>
#include <sched.h>

int main(void) {
    thrd_t t;
    cpu_set_t cpuset;
    // some initialization code here...
    pthread_setaffinity_np((pthread_t)t, sizeof(cpuset), &cpuset) // Is the cast valid?
    // other code here...
}

C ++ 11 предоставляет std :: thread :: native_handle , чтобы получить значение pthread_t в функциях pthread, но C11 не предоставляет такую ​​функцию,Так как thrd_t и pthread_t являются typedefs для unsigned long int, я полагаю, что они совместимы. Что стандарт говорит об этом?


Редактировать : этот же вопрос применим и к двум другим типам, предоставляемым threads.h, то есть mtx_t и cnd_t.

1 Ответ

3 голосов
/ 06 ноября 2019

Это недопустимо - у них разные интерфейсы, и это может измениться без вашего ведома.

Даже если thrd_t и thread_t имеют одинаковые псевдонимы, это не обязательно верно для всех платформ и тем болееони не обязательно имеют одинаковую структуру данных для представления потоков.

На практике это может работать в Linux, потому что большинство реализаций потоков C11 и C ++ 11 построены поверх библиотеки pthreads. Но это не обязательно будет таким же в будущем даже в Linux (например, ваша система может использовать другую библиотеку C, которая обеспечивает собственную реализацию потоков).

Я бы посоветовал вам использовать либо C11, либо pthreads, ноне предполагайте, что есть какая-либо совместимость, работает она или нет прямо сейчас . Это может измениться, если стандарт C в будущем предоставит такие гарантии. Но на данный момент это не так.

...