一劳永逸的std :: thread对象清理自己

时间:2018-10-19 04:53:02

标签: c++ multithreading

在实现服务等时,可能需要一劳永逸的功能,即创建一个线程并将其留给自己的设备。但是,需要将std::thread对象保留在某处以防止其超出范围,但是当线程完成时,将没有整洁的delete this支持,即使有,它也将是非指针分配问题。同样,更高级别的库可能具有Timer个对象,在该对象中可能会触发一击式计时器,但完成后需要清除。

一个人也许可以保留std::threadTimer对象的集合,并且每隔一段时间就会遍历列表并删除完成的对象,但这似乎很麻烦。有一些有用的成语来管理这些临时工吗?

我的直接解决方案是使用std::mutexstd::atomic的组合来获取返回BUSY的服务,所以我只有一个线程,但是像代码气味

2 个答案:

答案 0 :(得分:2)

这就是std :: thread :: detach()的作用-如果您希望线程“抛弃”,则在创建线程后对其调用CREATE TABLE `User` ( `User_id` integer, `plate_number` integer DEFAULT 0, `name` text DEFAULT 'user', `spot_number` integer DEFAULT 0, `credit` integer DEFAULT 0, `order_id` integer DEFAULT 0, FOREIGN KEY(`order_id`) REFERENCES `Orderr`(`order_id`), FOREIGN KEY(`spot_number`) REFERENCES `Spot`(`spot_id`), PRIMARY KEY(`User_id`) ); CREATE TABLE `Spot` ( `spot_id` integer, `user_id` text DEFAULT 'vacant', `order_id` integer DEFAULT 0, `status` integer DEFAULT 0, FOREIGN KEY(`order_id`) REFERENCES `Orderr`(`order_id`), FOREIGN KEY(`user_id`) REFERENCES `User`(`User_id`), PRIMARY KEY(`spot_id`) ); CREATE TABLE `Orderr` ( `order_id` integer, `user_id` text DEFAULT 'user', `spot_number` integer DEFAULT 0, `amount_due` integer DEFAULT 0, `time_lapse` integer DEFAULT 0, PRIMARY KEY(`order_id`), FOREIGN KEY(`user_id`) REFERENCES `User`(`User_id`), FOREIGN KEY(`spot_number`) REFERENCES `Spot`(`spot_id`) ); 。这将导致std:thread对象不再引用实际的执行线程,因此您可以销毁std :: thread,并且对执行没有影响。

答案 1 :(得分:1)

如果有很多“一劳永逸”功能,则可以考虑使用Thread Pool。创建和销毁线程会产生开销,并且其中很多可能会占用RT中的RAM。线程池为您启动X线程为您服务,它将为您管理每个“即发即弃”线程。

A simple Thread Pool that solve the problem for me

std::mutex与管理线程的资源无关,与同步线程有关。