1
7
C++0x将具有 Language Support for Transporting Exceptions between Threads 从提案中:
|
2
4
我不太清楚C++标准对一般例外的说法,但根据 this page ,所发生的事情是由平台定义的,您应该在编译器的文档中找到。
在我用g++4.0.1(具体来说是i686-apple-darwin8-g++-4.0.1)做的一个快速而肮脏的测试中,结果是
编撰
|
3
2
将调用未捕获的异常
即使覆盖默认值
因此,总之,一个未捕获的异常将终止程序,而不仅仅是线程。 |
4
2
这是Erlang存在的唯一最大原因。 我不知道惯例是什么,但我想,尽可能像厄兰一样。使堆对象不可变,并设置某种消息传递协议来在线程之间通信。避免使用锁。确保消息传递是异常安全的。在堆栈上保留尽可能多的有状态的内容。 |
5
2
正如其他人所讨论的,并发性(特别是线程安全性)是一个体系结构问题,它会影响系统和应用程序的设计方式。 但我想回答您关于异常安全和线程安全之间的紧张关系的问题。 在类级别上,线程安全需要更改接口。就像异常安全一样。例如,类通常返回对内部变量的引用,例如:
如果Foo由多个线程共享,那么麻烦就等着你了。当然,您可以放置互斥锁或其他锁来访问Foo。但很快,所有C++程序员都希望将FoO封装成“theStestSofFo”。我的论点是,Foo的接口应更改为:
是的,它更昂贵,但它可以通过Foo中的锁实现线程安全。IMnsHO这会在线程安全和异常安全之间产生一定的张力。或者至少,您需要执行更多的分析,因为作为共享资源使用的每个类都需要在这两种情况下进行检查。 |
6
2
一个经典的例子(不记得我在哪里第一次看到它)是在std库中。 以下是如何从队列中弹出内容:
但是由于T copy赋值可以抛出。如果复制在pop发生后抛出,那么该元素将从队列中丢失,并且永远无法恢复。但由于复制发生在元素弹出之前,因此可以在try/catch块中对front()的复制进行任意处理。 缺点是,由于涉及到两个步骤,因此无法使用std::queue接口实现线程安全的队列。对异常安全有利的(分离出可能抛出的步骤)现在对多线程不利。 在异常安全方面,您的主要救星是指针操作不是抛出。类似地,指针操作可以在大多数平台上实现原子化,因此它们通常可以成为多线程代码的救星。你可以吃你的蛋糕,也可以吃,但这真的很难。 |
7
1
没有
在线程化代码中。 Here |
8
0
我不建议让任何异常保持未破坏状态。将顶级线程函数包装在“捕获所有”处理程序中,这样可以更优雅(或至少更详细)地关闭程序。 |
9
0
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
rhymes · 如何让线程操作相同的java列表 2 年前 |