mo1230 发表于 2024-3-22 22:06

Linux C,怎么在主线程里把已经分离的子线程关闭掉

本帖最后由 mo1230 于 2024-4-3 11:09 编辑

子线程里在循环执行操作,想要在主线程中关闭这个已经处于分离状态的线程。
因为传入的参数是指针,所以想着通过改变这个指针指向的值,从而去关闭子线程。但是失败了,关闭不了,但是通过pthread_kill函数查看线程的状态,却显示线程已经不存在了。。。

这该怎么操作,才能在主线程里关掉子线程。


```
#include <iostream>
#include <pthread.h>
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"

struct data
{
    bool* run;
    int* num;
};


void* thread_func(void *arg)
{
    cv::Mat img;
    cv::VideoCapture cap(0);
    struct data* datas = (struct data*)arg;
    int i = *(datas->num);
    for (;;)
    {
      i++;
      cap >> img;
      if (img.empty())
      {
            std::cerr << "img is empty..." << std::endl;
            continue;
      }
      
      if (*(datas->run))
      {
            std::cout << "thread_func..." << i << img.size() << std::endl;
      }else
      {
            std::cout << "thread_func...end..." << std::endl;
            break;
      }
      


    }
   
}

int run()
{
    bool running = true;
    int i = 0;
    pthread_t t_pid;

    struct data data_s;
    data_s.run = &running;
    data_s.num = &i;

    pthread_create(&t_pid, NULL, thread_func, &data_s);
    pthread_detach(t_pid);
    _sleep(2000);
    while (running)
    {
      i++;
      std::cout << "run ..." << i << std::endl;
      _sleep(100);

      if (i > 100)
      {
            running = false;
            pthread_join(t_pid, NULL);
            // std::cout << "arg: " << *arg << std::endl;
            // pthread_cancel(t_pid);
            // pthread_join(t_pid, NULL);
            // _sleep(0);

            int state = pthread_kill(t_pid, 0);
            if (state == ESRCH)
            {
                std::cout << "thread is not exit..." << std::endl;
            }else if (state == EINVAL)
            {
                std::cout << "thread is invalid..." << std::endl;
            }else
            {
                std::cout << "thread is alive..." << std::endl;
            }
            
            
            
            return -1;
      }
      
    }
   
}

int main()
{
    run();
    std::cout << "main...end..." << std::endl;
    while (1)
    {
                        // 其他操作
                }
   
    return 0;   
}
```

Paranoid丶 发表于 2024-3-23 00:01

我常用的做法是,子线程的while判断退出标志,然后主线程需要关子线程的时候修改标志,然后join

mo1230 发表于 2024-3-23 01:22

Paranoid丶 发表于 2024-3-23 00:01
我常用的做法是,子线程的while判断退出标志,然后主线程需要关子线程的时候修改标志,然后join

我好像知道我错在哪儿了,不该pthread_detach。。。谢谢啦

ZMWAWOOPP 发表于 2024-3-23 13:28

Paranoid丶 发表于 2024-3-23 00:01
我常用的做法是,子线程的while判断退出标志,然后主线程需要关子线程的时候修改标志,然后join

谢谢楼主分享!!!!!!!!!

testpapa 发表于 2024-3-30 17:59

写法有问题的, pthread_detach 以后就不能在使用 pthread_join 来等待线程结束了。pthread_detach() 就表示这个线程分离了。

mo1230 发表于 2024-3-31 10:30

testpapa 发表于 2024-3-30 17:59
写法有问题的, pthread_detach 以后就不能在使用 pthread_join 来等待线程结束了。pthread_detach() 就表 ...

嗯嗯谢谢,是我理解有问题。。。被绕晕了。

mo1230 发表于 2024-3-31 10:32

mo1230 发表于 2024-3-31 10:30
嗯嗯谢谢,是我理解有问题。。。被绕晕了。

不过话说,分离后的线程,主线程是不是就没法控制那个子线程结束了。。
页: [1]
查看完整版本: Linux C,怎么在主线程里把已经分离的子线程关闭掉