Могут ли потоки из разных процессов иметь одинаковый идентификатор? - PullRequest
0 голосов
/ 28 октября 2018

Я пишу программу, в которой я хочу создать несколько процессов и несколько потоков для каждого из этих процессов.Короче говоря, моя программа создает несколько процессов и несколько потоков для каждого процесса.

Это краткий фрагмент кода:

void NormalityComponent::newThread(int thread_id){
    std::cout << "New Thread [" << thread_id +1 << "] created in Component [" << name_component << "] with id " << std::this_thread::get_id() << std::endl;
    timeSimulation();
    std::cout << "Thread [" << thread_id +1 << "] in [" << name_component << "] with id " << std::this_thread::get_id() << " ends its simulation" << std::endl;
}

void NormalityComponent::timeSimulation(){
    for (int i = 0; i < time_factor * TEMPORAL_PARAMETER; i++);    
}

void NormalityComponent::startAnalysisMode3(){
    //creation of a new process to simulate the Normality Component Analysis and a thread for each Instance.

            pid_t pid = fork();
            if (pid == 0){
                  //Child Process
                  std::cout << "New Normality Component ["<< name_component <<"] created with id " << getpid() << std::endl;
                  //Creation of instances
                    for(int i = 0; i < number_instances;i++){
                        v_threads.push_back(std::thread(&NormalityComponent::newThread,this, i));
                        std::this_thread::sleep_for (std::chrono::milliseconds(100));
                    }

                    std::for_each(v_threads.begin(), v_threads.end(), std::mem_fn(&std::thread::join));

                    kill(getpid(), SIGTERM); //it ends the process when the threads finish. 
            }
}

, и это фрагмент вывода:

New Thread [1] created in Component [Velocity] with id 140236340983552
New Thread [1] created in Component [FaceRecognition] with id 140236340983552
New Thread [1] created in Component [Trajectories] with id 140236340983552
New Thread [2] created in Component [Velocity] with id 140236332590848
New Thread [2] created in Component [Trajectories] with id 140236332590848
New Thread [2] created in Component [FaceRecognition] with id 140236332590848

Могут ли потоки из разных процессов иметь одинаковый идентификатор?Странно, идентификатор каждого потока должен быть уникальным, верно?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вы можете попробовать вызвать gettid или GetCurrentThreadId

@ VTT, gettid () сработал для меня.

void NormalityComponent::newThread(int thread_id){
pid_t tid = (pid_t) syscall (SYS_gettid);

std::cout << "New Thread [" << thread_id +1 << "] created in Component [" << name_component << "] with id " << tid << std::endl;
timeSimulation();
std::cout << "Thread [" << thread_id +1 << "] in [" << name_component << "] with id " << tid << " ends its simulation" << std::endl;

}

Это решение предоставляет уникальный идентификатор для каждого потока.Пример вывода следующий:

New Normality Component [Trajectories] created with id 5118
New Normality Component [Velocity] created with id 5119
New Thread [1] created in Component [Trajectories] with id 5121
New Normality Component [FaceRecognition] created with id 5120
New Thread [1] created in Component [Velocity] with id 5122
New Thread [1] created in Component [FaceRecognition] with id 5123
New Thread [2] created in Component [Trajectories] with id 5124
New Thread [2] created in Component [Velocity] with id 5125
New Thread [2] created in Component [FaceRecognition] with id 5126
Thread [1] in [Velocity] with id 5122 ends its simulation
New Thread [3] created in Component [Trajectories] with id 5127
New Thread [3] created in Component [FaceRecognition] with id 5128
New Thread [4] created in Component [FaceRecognition] with id 5129

В любом случае, я хотел бы понять, почему this_thread :: get_id () не возвращает идентификатор потока.Если вы посмотрите документацию на c ++, вы увидите, как описание функции указывает, что она возвращает идентификатор потока.

0 голосов
/ 28 октября 2018

Эти идентификаторы потоков больше похожи на адреса.Значение, возвращаемое this_thread::get_id(), необязательно так же, как системный "идентификатор потока".В основном это служит для обеспечения сравнения строк / работы в качестве ключа для потоков в ассоциативных контейнерах.Вы можете попробовать позвонить gettid или GetCurrentThreadId.Обратите внимание, что в windows «Пока поток не завершится, идентификатор потока однозначно идентифицирует поток во всей системе.» , поэтому потоки из разных процессов не могут иметь одинаковый идентификатор.На других платформах поведение может отличаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...