在thrd_t上调用pthread函数合法吗?

对线程的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_tpthread_t都是unsigned long int的typedef,因此我想它们是兼容的。标准怎么说呢?


编辑:同一问题也适用于threads.h提供的其他两种类型,即mtx_tcnd_t

ying_09222 回答:在thrd_t上调用pthread函数合法吗?

这是无效的-它们具有不同的界面,并且可能会在您不知情的情况下发生变化。

即使thrd_tthread_t碰巧具有相同的别名,也不一定在所有平台上都是如此,更重要的是,它们不一定具有相同的别名。 表示线程的数据结构。

在实践中,这可能在Linux上有效,因为大多数C11和C ++ 11线程实现都是基于pthreads库构建的。但这并不能保证将来甚至在Linux上也是如此(例如,您的系统可能会使用提供自己的线程实现的其他C库)。

我建议您使用C11或pthreads,但不要假设现在是否存在任何互操作性。如果将来的C标准提供此类保证,则可能会改变。但是目前还没有。

本文链接:https://www.f2er.com/3153912.html

大家都在问