我用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
答案 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
终止时。