应该set_terminate/ get_terminate为C++ 2011或C++ 2003中的多个线程设置不同的终止异常处理器?
例如,如果我有程序并设置终止处理程序func_1; 然后我开始3个线程.什么是新线程中的终止处理程序?如果在每个线程中我将设置终止处理程序到func_2第一个线程,func_3第二个线程等等.
N3242(C++ 2011草案)[handler.functions]在[support.exception]/ 或中没有说明[exception.terminate]
PS:对于这些标准的任何流行实现,您可以回答C++ 2011或C++ 2003
PPS:有FCD评论... C++ FCD评论状态版本5 N3249(2011):
GB 71 18.6.2.4 / 18.8.2.2 / 18.8.3.2
Run Code Online (Sandbox Code Playgroud)
的线程安全
std::set_new_handler(),std::set_unexpected(),std::set_terminate(),是不确定使得功能不可能一个线程安全的方式使用.必须指定函数的线程安全保证,并且应提供新接口,以便以线程安全的方式查询和安装处理程序.
LWG 1365 接受修改
见文件 N3189
我在这里阅读了很多帖子,问题是C++的标准容器(如"list"或"map"是线程安全的,所有人都说它不是一般的.并行读取应该没问题,但并行写入或者并行读写可能会导致问题.
现在我发现在www.cplusplus.com上,在大多数操作期间访问或修改列表是安全的.
一些例子:
访问容器(const和非const版本都不会修改容器).不访问映射值:同时访问或修改元素是安全的.
容器已修改.同时访问现有元素是安全的,尽管容器中的迭代范围不是.
我是否想念cplusplus.com或者我还有什么关于std容器中线程安全的知识.
提前致谢!
PS:我要的是C++ 03而不是C++ 11
我的团队正在开发一个嵌入式系统,我们需要遵循MISRA C++.
我们正在重构代码以使用更少的虚方法,因此我们尝试实现CRTP以使用静态多态而不是动态多态.
但是我们遇到静态多态性需要指针转换的问题,因此我们的静态分析检查器会抱怨.
这是界面
template <typename T>
class UpdateMethod
{
protected:
~UpdateMethod() {}
public:
void operator()() const
{
// [MISRA Rule 5-2-7] violation:
static_cast<const T*>(this)->update();
}
};
Run Code Online (Sandbox Code Playgroud)
以下是其中一个实现:
class A
: public UpdateMethod<A>
{
public:
void update() const {}
};
Run Code Online (Sandbox Code Playgroud)
在通过MISRA检查程序时,它会抱怨static_cast(从ptr转换为ptr(e926).
所以,我的问题是:有没有什么好的方法来实现CRTP而不必压制MISRA警告,所以以安全的方式?
仅有关于指针转换的相关问题: MISRA C++ 2008规则5-2-7违规:指针类型的对象不应直接或间接转换为无关指针类型 我在CRTP中具有相同的错误.
编辑:正如前面提到的只有C++ 03而没有像boost这样的外部库.
我注意到将a分配char给const int&编译,但将其分配给a int&会产生编译错误.
char c;
int& x = c; // this fails to compile
const int& y = c; // this is ok
Run Code Online (Sandbox Code Playgroud)
我知道这样做不是一个好习惯,但我很想知道它发生的原因.
我通过寻找"分配给不同类型的引用","将char分配给int引用"和"const引用与非const引用之间的区别"来搜索答案,并且遇到了许多有用的帖子(int VS const int的和,分配一个char到一个int变量时怪异的行为,转换字符在C和C++为int,参考和const引用作为函数参数之间的区别是什么?),但他们似乎并不是解决我的问题.
如果以前已经回答过,我很抱歉.
类模板::std::numeric_limits<T>只能为类型实例化,类型T可以是函数的返回值,因为它总是定义成员函数,如static constexpr T min() noexcept { return T(); }(更多信息请参见http://www.cplusplus.com/reference/limits/numeric_limits/) c ++ 03或c ++ 11中的特殊版本.
如果T是,即int[2]实例化将立即导致编译时错误,因为int[2]不能是函数的返回值.
::std::numeric_limits使用安全版本进行包装很容易 - 如果确定实例化::std::numeric_limits是否安全的方法是已知的.这是必要的,因为如果可能的话,应该可以访问有问题的功能.
显而易见(显然是错误的)测试方法::std::numeric_limits<T>::is_specialised不起作用,因为它需要实例化有问题的类模板.
有没有办法测试实例化的安全性,最好不要列举所有已知的坏类型?甚至可能是确定任何类模板实例化是否安全的一般技术?
标题有点含糊不清.
可以说我有一个模板定义为:
template < typename T >
void foo ( int x ) ;
template <>
void foo<char> ( int x ) ;
template <>
void foo<unsigned char> ( int x ) ;
template <>
void foo<short> ( int x ) ;
...
Run Code Online (Sandbox Code Playgroud)
内部都foo<signed>()和foo<unsigned>()做同样的事情.唯一的要求是T8位类型.
我可以通过创建另一个模板来定义基于大小的标准类型.
template < typename T, size_t N = sizeof( T ) > struct remap ;
template < typename T, size_t > struct remap< 1 >
{
typedef unsigned char value; …Run Code Online (Sandbox Code Playgroud) 如果你想让迭代器在返回之前与它们迭代的东西一起旋转,那就boost::transform_iterator非常好了.你传递一个一元函数,它转换底层迭代器的结果,operator*()然后转换迭代器返回:
template<typename Map>
struct iterator_transform_traits_map_second {
typedef typename Map::value_type value_type;
typedef typename Map::mapped_type result_type;
result_type& operator()( value_type& v) const {return v.second;}
const result_type& operator()(const value_type& v) const {return v.second;}
};
typedef
boost::transform_iterator<iterator_transform_traits_map_second>
transformed_iterator;
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但.
你的同事喜欢这个闪亮的新工具,并且也开始使用它,很快就会有人收集你们目前为止所提出的内容.这是我们的:
iterator_transform_traits_map_firstiterator_transform_traits_map_seconditerator_transform_traits_map_deref (取消引用任何容器的条目)iterator_transform_traits_map_deref_second(取消引用地图条目second)iterator_transform_traits_map_dynamic_cast(执行dynamic_cast<>()任何容器的输入)iterator_transform_traits_map_any_second(执行any_cast<>()地图条目second)当然,这留下了许多有用的(因为还没有人需要它们),并且它根本不能扩展.我的任务是编写一个迭代器来取消引用地图条目second并执行一个dynamic_cast<>(),我是谁,我被拒绝只是添加一个iterator_transform_traits_map_dynamic_cast_deref_second并继续前进.
相反,我试图写一些基本特征和编译时组成特征,允许将其中几个命名为模板参数,并简单地管理调用.理想情况下,我想要这样的东西:
typedef
boost::transform_iterator<
iterator_transform_traits< iter_transf_tr_second
, iter_transf_tr_deref …Run Code Online (Sandbox Code Playgroud) 我读到这里从一个std ::双端队列具有以下特点公认的答案
1- Random access - constant O(1)
2- Insertion or removal of elements at the end or beginning - amortized constant O(1)
3- Insertion or removal of elements - linear O(n)
Run Code Online (Sandbox Code Playgroud)
我的问题是关于第2点.双端队列如何在结束或开始时进行摊销?
我知道a std::vector在最后插入时具有摊销的常数时间复杂度.这是因为矢量是连续的并且是动态阵列.因此,当最后一个内存耗尽push_back时,它将分配一个全新的内存块,将现有项目从旧位置复制到新位置,然后从旧位置删除项目.我理解的这个操作是摊销不变的.这如何适用于双端队列?如何在双端队列的顶部和底部插入是否可以摊销.我的印象是它应该是常数O(1).我知道一个双端队列由内存块组成.
对于这个特定项目,我无法使用C++ 11功能(例如decltype),因为编译器还不支持它们.我需要能够提供当前类作为模板参数,最好是在没有参数的宏中(见下文),而不需要修饰class声明或隐藏花括号等.
class Foo: private Bar<Foo> {
MAGIC //expands to using Bar<Foo>::Baz; and some others
public:
void otherFunction();
//... the rest of the class
};
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望这与Qt的Q_OBJECT宏非常相似,但不会引入另一个预编译步骤和相关的生成类.typeid可能在运行时很有用,但我的目标是在构建时完成所有这些.
如何编写MAGIC宏以便每次都不需要重复类名?
在AIX上使用xlC编译以下内容会导致打印"2 2"的代码.在使用gcc和clang的Linux上,它可靠地生成"3 3".
#include <iostream>
struct Numbers
{
Numbers() : a(0) , b(0) { }
Numbers(int a, int b) : a(a), b(b) { }
int a;
int b;
};
Numbers combine(const Numbers& a, const Numbers& b)
{
Numbers x;
x.a = a.a + b.a;
x.b = a.b + b.b;
return x;
}
Numbers make()
{
Numbers a(1, 1);
Numbers b(2, 2);
a = combine(a, b);
return a;
}
int main()
{
Numbers a = make();
std::cerr << a.a << " …Run Code Online (Sandbox Code Playgroud)