来自非Qt线程的QThread::getCurrentThread()

10

如果从非Qt线程调用QThread::getCurrentThread(),我将得到什么?

谢谢!


为什么不试一下呢? - sashoalm
你是指QThread::currentThread()吗?还有一个问题:你为什么要这样做? - user362638
这可能是未定义行为。 - sashoalm
1个回答

12

QThread只是一个包装器,背后它使用本机线程。

QThread::currentThread如果尚不存在,则创建并初始化Q(Adopted)Thread实例。

在Unix系统中,它使用pthread

#include <iostream>
#include <thread>
#include <pthread.h>

#include <QThread>
#include <QDebug>

void run() {
    QThread *thread = QThread::currentThread();

    qDebug() << thread;
    std::cout << QThread::currentThreadId() << std::endl;
    std::cout << std::this_thread::get_id() << std::endl;
    std::cout << pthread_self() << std::endl;

    thread->sleep(1);
    std::cout << "finished\n";
}

int main() {
    std::thread t1(run);
    t1.join();
}

输出:

QThread(0x7fce51410fd0) 
0x10edb6000
0x10edb6000
0x10edb6000
finished

我看到在这里有Qt应用程序主线程的初始化:there

data->threadId = (Qt::HANDLE)pthread_self();
if (!QCoreApplicationPrivate::theMainThread)
    QCoreApplicationPrivate::theMainThread = data->thread;

因此可能会有一些副作用。

我建议不要将QThread与非Qt线程混合使用。


2
可能会有哪些副作用?为什么不建议混合使用它们? - Konrad
另一种方式是否兼容?即使用QThread创建线程,然后使用this_thread::get_id()获取ID。 - iammilind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接