大纲链接:
Star_Tool:一个C++跨Windows和Linux的工具库_菜鸟小田的博客-优快云博客
在并发编程的学习中,我了解到由于C++没有对线程中断的标准支持,所以我扩写了该类并封装进了该star命名空间中。
其中有部分交叉编译和编译扩展的相关方面知识,我会单独开一个编写思路指南,但当前博客主要为使用文档,就不赘述实现原理了,现在开始介绍相关公共接口:
class thread : public std::thread {
public:
template<typename Function, typename... Args>
thread(Function&& function, Args&&... args);
template<typename Function>
thread(Function&& function);
void interrupt();
void interrupt(std::string msg);
void try_interrepted() noexcept(false);
void clear();
}
这是基本类的扩展,由于是直接公告继承std::thread的,故大部分star::thread的接口可以直接使用,在此不赘述介绍了,主要介绍扩展的功能:
template<typename Function, typename... Args>
thread(Function&& function, Args&&... args);
template<typename Function>
thread(Function&& function);
两个构造函数直接调用并直接传递给父类的std::thread的构造函数,意义与父类相同,更多详细可以参考std::thread的文档。
void interrupt();
将线程中断,向这个线程发送中断标志,线程内的中断标志位被设置,线程可以被中断,当调用相关尝试中断操作时会抛出interrupt_except异常(详细见后续)
void interrupt(std::string msg);
将线程中断,向这个线程发送中断标志,并将线程的中断信息设置为msg,线程内的中断标志位被设置,线程可以被中断,当调用相关尝试中断操作时会抛出类型为interrupt_except异常(详细见后续),异常中包含msg信息。
void try_interrepted() noexcept(false);
尝试中断,会检测线程是否被设置了中断标志,若线程被设置了中断标志,则会抛出类型为interrupt_except的异常,并在异常体内附带异常信息。
void clear();
会清除中断标志并清除中断消息,当调用clear后再尝试调用try_interrepted后将不会触发异常。
好的,关于star::thread类到此就介绍完毕了,但其相关操作并没有完毕,以为我们调用中断常常是在创建线程实例的线程调用中断,在子线程中尝试是否中断,但子线程由于是通过函数方式运行的,检测不到相关的中断标志,故我提出一套解决方案,在star中添加一个命名空间this_thread,在其中添加一系列全局函数,其标志位与类实例的标志位是同一个标志位(也就是相通的),这样就可以完成对子线程的控制。
this_thread空间下函数如下:
namespace this_thread {
void interrupt();
void interrupt(std::string msg);
void try_interrepted() noexcept(false);
void clear();
}
其功能与实例内的同名方法的功能是相同的,可以被类内函数当中全局函数调用,且其触发时机也是与类内函数相同的,在此不再赘述其功能。
好的,其这个功能的相关外部接口介绍到此,其实现方法对我来讲还是有些复杂的,特别是实现类内函数和全局函数触发时机的相通性,所以我会后续开一个单独的链接来介绍实现方法。