我可以让pthread_t实例超出范围吗?

时间:2011-07-28 08:11:18

标签: c pthreads

我用C和pthreads编程。我有一个长期运行的函数,我想在一个单独的线程中运行:

void long_running_function(void * arg) {  
  ...
}


void start_long_running_function(void * arg) {  
  pthread_t thread;  
  pthread_create( &thread , NULL , long_running_function , arg);
  /* What about the thread variable? */  
}  

当离开start_long_running_function()函数时,局部变量'thread'将超出范围。这样可以 - 或者我可以冒险解决问题,例如当long_running_function()完​​成时?

我已经尝试过我的代码中说明的方法,它似乎有用 - 但也许这只是运气?

关心Joakim

2 个答案:

答案 0 :(得分:4)

是的 - 让变量超出范围是安全的。但请记住,您必须在某些时候做两件事之一:

1)pthread_detach()它会让内核释放某些与之相关的东西。

2)pthread_join()它有副作用分离它。

如果你不这样做,我认为这将是资源泄漏。

答案 1 :(得分:0)

这是一个C结构,Plain Old Data,因此当它超出范围时,没有析构函数可以引入副作用。失去范围的唯一含义是你再也看不到它了。

我知道你的是一个C问题,但很多线程实现用这样的东西解决了这个问题:

class Thread {
    pthread_t handle;

    static void * start (void * self) {
        static_cast <Thread *> (self) -> run ();
    }

    protected: void run () = 0;

    public: void start () {
        pthread_create (&handle, NULL, start, this);
    }

    ~ Thread () {
        pthread_join (&handle, NULL);
    }
};

你可以做一些与C类似的事情,arg是指向包含线程句柄的malloc ed结构的指针;线程函数frees终止时。