0
我使用QThread
作爲線程管理器,我想知道是否可以實例化所有管理同一線程的多個QThread
對象?QThread的多個實例是否可以引用相同的OS線程?
我使用QThread
作爲線程管理器,我想知道是否可以實例化所有管理同一線程的多個QThread
對象?QThread的多個實例是否可以引用相同的OS線程?
不,當然。
單個線程只能由1 QThread的管理,因爲它會被裏面void QThread::start(Priority)
內部創建,也就是noway設置線程QThread
int code = pthread_create(&threadId, &attr, QThreadPrivate::start, this);
pthread_create
將啓動新線程。
#if defined(Q_CC_MSVC) && !defined(_DLL) // && !defined(Q_OS_WINRT)
# ifdef Q_OS_WINRT
// If you wish to accept the memory leaks, uncomment the part above.
// See:
// https://support.microsoft.com/en-us/kb/104641
// https://msdn.microsoft.com/en-us/library/kdzttdcb.aspx
# error "Microsoft documentation says this combination leaks memory every time a thread is started. " \
"Please change your build back to -MD/-MDd or, if you understand this issue and want to continue, " \
"edit this source file."
# endif
// MSVC -MT or -MTd build
d->handle = (Qt::HANDLE) _beginthreadex(NULL, d->stackSize, QThreadPrivate::start,
this, CREATE_SUSPENDED, &(d->id));
#else
// MSVC -MD or -MDd or MinGW build
d->handle = (Qt::HANDLE) CreateThread(NULL, d->stackSize, (LPTHREAD_START_ROUTINE)QThreadPrivate::start,
this, CREATE_SUSPENDED, reinterpret_cast<LPDWORD>(&d->id));
#endif // Q_OS_WINRT
兩個CreateThread
和_beginthreadex
將創建當然一個新的線程。
但我已經在我的程序中使用QOject :: QThread()獲得了不同的QThread對象指針,但它們都返回相同的句柄,表明它們實際上在管理相同的線程。這怎麼可能? –
澄清;與句柄我的意思是從QThread返回值:: currenthThreadId() –
@LennartRolland你的意思是['QObject :: thread']函數?該函數返回一個指向該對象所在的'QThread'的指針。由於你的大部分對象都會駐留在主線程中,它將返回**相同的指針**,這意味着它是**相同的'QThread' ** – Danh