Я использую QThread
в качестве менеджера потоков, и мне интересно, можно ли инициировать несколько объектов QThread
, которые управляют одним и тем же потоком?Может ли несколько экземпляров QThread ссылаться на один и тот же поток ОС?
0
A
ответ
1
Нет, конечно.
Один поток может управляться только 1 QThread, потому что он будет создан внутри внутри void QThread::start(Priority)
, там уже ни в коем случае, чтобы установить нить на 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
создаст новый поток, конечно.
Но у меня в моей программе были получены различные указатели на объект QThread с использованием QOject :: QThread(), но все они возвращают тот же дескриптор, указывая, что они фактически управляют одним и тем же потоком. Как это возможно? –
Чтобы уточнить; с ручкой Я имею в виду returnvalue от QThread :: currenthThreadId() –
@LennartRolland Вы имеете в виду функцию '' QObject :: thread'? Эта функция возвращает указатель на 'QThread', в котором живет этот объект. Поскольку большая часть вашего объекта будет жить в основном потоке, он вернет ** тот же указатель **, это означает, что это тот же самый 'QThread' ** – Danh