在实现服务等时,可能需要一劳永逸的功能,即创建一个线程并将其留给自己的设备。但是,需要将std::thread
对象保留在某处以防止其超出范围,但是当线程完成时,将没有整洁的delete this
支持,即使有,它也将是非指针分配问题。同样,更高级别的库可能具有Timer
个对象,在该对象中可能会触发一击式计时器,但完成后需要清除。
一个人也许可以保留std::thread
和Timer
对象的集合,并且每隔一段时间就会遍历列表并删除完成的对象,但这似乎很麻烦。有一些有用的成语来管理这些临时工吗?
我的直接解决方案是使用std::mutex
和std::atomic
的组合来获取返回BUSY
的服务,所以我只有一个线程,但是像代码气味
答案 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
与管理线程的资源无关,与同步线程有关。