linux c ++ использовать std :: thread join, генерировать исключение - PullRequest
0 голосов
/ 04 марта 2020

мой проект использует три уровня процесса. Чтобы код после разветвления не наследовал от рабочего потока предыдущего процесса, поэтому создайте подпоток для разветвления подпроцесса при каждом вызове.

Теперь я обнаружил некоторые проблемы при следующем описании:

1. процесс внука создает std :: thread (work_thread), когда вызвал метод join (), он выдает исключение
2. , если доза процесса сына не входит в метод fork () подпотока, то это не исключение

3. если в процессе внука создать пустой std :: thread (это ничего не делать) перед созданием рабочего потока, а пустой поток вызвал метод join () после рабочего потока, вызванного join (), то он это не бросает исключение. но если пустой поток, называемый join () перед рабочим потоком, также выдаст то же исключение

, если вы можете мне помочь, пожалуйста, напишите свой ответ, я очень вам благодарен

следующее код - это тестовый пример:

#include <iostream>
#include <unistd.h>
#include <wait.h>
#include <thread>
using namespace std;
int main(int argc, char **argv)
{
  std::thread t([]() {
    int l2pid = fork();
    if(l2pid > 0)
      waitpid(l2pid, NULL, 0);
    else if (l2pid == 0)
    {
      std::thread t2([]() {
        int l3pid = fork();
        if (l3pid > 0)
          waitpid(l3pid, NULL, 0);
        else if (l3pid == 0){
          //std::thread empty_thread([](){
          //});
          std::thread work_thread([](){
            for(int i = 0; i < 5; i++){
              std::cout << "working..." << std::endl;
              std::this_thread::sleep_for(std::chrono::seconds(1));
            }
          });
          if(work_thread.joinable())
            work_thread.join();
          //if(empty_thread.joinable())
           // empty_thread.join();
          std::cout << "L3 Process Exit!" << std::endl;
        }
      });
      if (t2.joinable())
        t2.join();
      std::cout << "L2 Process Exit!" << std::endl;
    }
  });
  if (t.joinable())
    t.join();
  std::cout << "Main Process Exit!" << std::endl;
  return 0;
}

я использую pthread_create, а pthread_join также возвращает EDEADLK

#include <iostream>
#include <unistd.h>
#include <wait.h>
#include <thread>
#include <vector>
#include <pthread.h>
using namespace std;
void *work_thread(void *)
{
  for (int i = 0; i < 5; i++)
  {
    std::cout << "working..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
  }
  return NULL;
}

void *t2_function(void *)
{
  int l3pid = fork();
  if (l3pid > 0)
  {
    waitpid(l3pid, NULL, 0);
  }
  else if (l3pid == 0)
  {
    pthread_t thread_handle;
    int ret = pthread_create(&thread_handle, NULL, work_thread, NULL);
    std::this_thread::sleep_for(std::chrono::seconds(3));
    void *pthread_ret = NULL;
    std::cout << "thread_handle:" << thread_handle << ",pthread_self:" << pthread_self() << std::endl;
    ret = pthread_join(thread_handle, &pthread_ret);
    std::cout << "pthread_join:" << ret << std::endl;
    std::cout << "L3 Process Exit!" << std::endl;
  }
}

void * t1_function(void *)
{
  int l2pid = fork();
  if (l2pid > 0)
    waitpid(l2pid, NULL, 0);
  else if (l2pid == 0)
  {
    pthread_t l2;
    pthread_create(&l2, NULL, t2_function, NULL);
    pthread_join(l2, NULL);
    std::cout << "L2 Process Exit!" << std::endl;
  }
}
int main(int argc, char **argv)
{
  pthread_t l1;
  pthread_create(&l1, NULL, t1_function, NULL);
  pthread_join(l1, NULL);
  std::cout << "L1 Process Exit!" << std::endl;
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...