Я читал темы и параллелизм и наткнулся на эту цитату:
std::this_thread::get_id() возвращает идентификатор вызывающего его потока.
Итак, я написал следующий код, чтобы протестировать функцию и посмотреть, делает ли она что-то еще, кроме того, что делает Uniux gettid()
:
#include <iostream>
#include <thread>
#include <chrono>
#include <unistd.h>
using namespace std;
void someFunction(){
int i = 0;
while(i++ < 2){
cout<<"TID using gettid(): "<< gettid()<<endl;
cout<<"TID using this_thread::get_id: "<< this_thread::get_id()<<endl<<endl;
std::this_thread::sleep_for(chrono::milliseconds(900));
}
}
int main(){
cout<<"Hello from main"<<endl;
cout<<"TID using gettid(): "<<gettid()<<endl;
cout<<"TID using this_thread::get_id(): "<<this_thread::get_id()<<endl<<endl;
thread testThread(someFunction);
testThread.join();
return 0;
}
Вывод показывает, что две функции возвращают разные значения, и у меня вопрос: почему? это связано с pths и pthreads?
@gerum Потому что они двое должны возвращать идентификатор текущего потока!
Возможно, pthread_self()
подойдет лучше, чем gettid()
?
gettid
возвращает число. std::thread::get_id()
возвращает класс, который можно копировать, сравнивать и распечатывать, но не гарантируется, что он будет иметь числовое значение. Таким образом, они даже не рекламируются как возвращающие тот же или совместимый тип. (и pthread_self
возвращает непрозрачное значение, которое официально поддерживает только pthread_equal
)
gettid
специфичен для Linux, C++ не зависит от операционной системы, он должен охватывать все возможные операционные системы, даже те, где потоки не имеют числовых идентификаторов. По этой причине std::thread::get_id()
определяется как возвращающее непрозрачное значение, которое не имеет другого значения, кроме уникальности для каждого потока.
Вот как get_id()
реализован в libstdc++: return thread::id(pthread_self());
. Обманщик объясняет разницу между вызовами pthread_self()
и gettid()
.
gettid()
— это специальный системный вызов Linux, возвращающий идентификатор потока, вызвавшего его. Возвращаемый тип — это pid_t
(целое число), как написано на странице руководства https://man7.org/linux/man-pages/man2/gettid.2.html
Нет никакой гарантии, что этот системный вызов вернет тот же номер, что и идентификатор потока POSIX.
Функция C++ std::this_thread::get_id()
является частью стандарта C++ и совершенно другая. Его цель — идентифицировать потоки в разных системах (не только в Linux). Более того, тип, возвращаемый этой функцией, не является целым числом, а представляет собой std::thread::id
, и вы можете вывести его на консоль только потому, что его оператор <<
перегружен.
https://en.cppreference.com/w/cpp/thread/thread/id
Никакая гарантия не объясняет, почему цифры разные. get_id()
имеет некоторую реализацию в Linux, которая преобразуется в вызов функции C. std::thread::id
— это всего лишь тонкая обертка, которая в данном контексте не имеет никакого значения.
Почему вы ожидаете получить то же самое?