草庐IT

core-thread-operations

全部标签

c++ - 我可以在 gdb pretty-print 中直接调用程序的 `operator[]` 吗?

我正在尝试使用GDB的pretty-print工具来显示自定义C++矩阵类。类(class)非常标准,您可以在任何地方找到。它是一个由类型参数化的模板,可以使用mat[i][j]等C类型符号访问。这首先隐式返回另一个表示行或列的模板“Slice”类,[]运算符可以再次访问它以提取数据。该类本身使用普通C数组进行存储,但它在其上实现了一些技巧,例如预分配更大矩阵的选项、启用非零开始、使用步幅等。该类没有native打印接口(interface),我无法修改它,也无法轻松链接到我自己的代码。自定义功能使得在Python中重现直接数据访问代码变得很痛苦。但那有必要吗?一般来说:为什么pret

c++ - VC++ 11 中的 std::thread 类导致随机崩溃。任何解决方法?

我在VisualStudio11DeveloperPreview中遇到了一个错误,至少我认为这是一个错误并报告了它,但我很想知道是否有人知道解决方法。当我使用std::thread类创建多个线程时,它会导致应用程序崩溃。有时它会抛出异常,有时会导致访问冲突,有时它会起作用。重现错误的代码如下所示:#include#include#include#includeint_tmain(intargc,_TCHAR*argv[]){std::vectorthreads;for(inti=0;ijoin();deletethreads[i];}return0;}使用静态或动态CRT库并不重要(它

c++ - 从 native 句柄创建 std::thread?

如果我有一个std::thread对象t,我可以使用t.native_handle()来访问API底层线程实现(例如,pthreads或Windows线程)。但是,如果我有一个来自底层线程实现的句柄(例如,一个pthreads线程)怎么办?有什么方法可以将其转换为C++11std::thread?这样做的动机是可能需要使用native平台线程API来设置线程,例如,具有特定的亲和性或特定的堆栈大小(或无法通过C+访问的其他一些特征)+11API)。然而,从那时起,最好坚持使用C++11功能。有什么办法吗? 最佳答案 使用GCC,您可

C++ - 我应该使 `operator+` 为常量吗?它会返回引用吗?

当一个类重载operator+时,是否应该声明为const,因为它不对对象做任何赋值?另外,我知道operator=和operator+=返回一个引用,因为进行了赋值。但是,operator+呢?当我实现它时,我应该复制当前对象,将给定对象添加到该对象,然后返回该值吗?这是我的:classPoint{public:intx,inty;Point&operator+=(constPoint&other){X+=other.x;Y+=other.y;return*this;}//Theaboveseemsprettystraightforwardtome,butwhataboutthis?

c++ - 将 operator new 和 operator delete 与自定义内存池/分配器一起使用

我正在研究一个内存池/内存分配器实现,我正在一个庄园中设置它,只有一个特殊的“客户端”对象类型可以从池中提取。客户端可以直接构建到池中,或者它可以使用池进行动态内存调用,或者理论上它可以同时进行。我希望能够以调用我的池“alloc()”和“free()”函数的方式重载operatornew和operatordelete,以便获取构建对象所需的内存。我遇到的主要问题之一是让我的运算符(operator)删除以便能够通过调用我编写的pool->free()函数来释放内存。我想出了一个hack,通过将池传递到构造函数并让析构函数执行释放工作来修复它。这一切都很好而且花花公子,直到有人需要从这

c++ - 为什么我不能在 'std::deque' 上使用 operator< ?

在我的代码库上运行cppcheck并收到以下错误:Dangerousiteratorcomparisonusingoperator但是双端队列的迭代器是随机访问迭代器,随机访问迭代器支持不等式运算符。那么是什么给了?例子:#includeintmain(){std::dequed;std::deque::iteratordi1=d.begin();std::deque::iteratordi2=d.end();if(di1编辑:此错误已通过cppcheckticket#5926提交并修复. 最佳答案 这是cppcheck中的一个错误

c++ - 为什么thread_local不能应用于非静态数据成员以及如何实现线程局部非静态数据成员?

为什么thread_local不能应用于非静态数据成员?thisquestion的公认答案说:“将非静态结构或类成员设为线程本地是没有意义的。”老实说,我看到很多很好的理由让非静态数据成员成为线程本地的。假设我们有某种ComputeEngine,其成员函数computeSomething被连续调用多次。成员函数内部的一些工作可以并行完成。为此,每个线程都需要某种ComputeHelper来提供辅助数据结构等。所以我们真正想要的是:classComputeEngine{public:intcomputeSomething(Argsargs){intsum=0;#pragmaomppara

c++ - 从 std::deque 线程安全地同时调用 emplace_back() 和 operator[]() 吗?

来自emplace_back()的文档摘录:IteratorvalidityAlliteratorsrelatedtothiscontainerareinvalidated,butpointersandreferencesremainvalid,referringtothesameelementstheywerereferringtobeforethecall.DataracesThecontainerismodified.Nocontainedelementsareaccessedbythecall:concurrentlyaccessingormodifyingthemissafe

c++ - 一个 const std::function 包装一个非常量 operator()/mutable lambda

考虑以下示例:#include#includestructA{inti;voidoperator()(){std::coutconst&fun){fun();}intmain(){conststd::functionf{A{}};test(f);test(f);}在这里,conststd::function能够调用非constoperator().输出:12如果我提供一个mutablelambda,也会发生同样的情况,例如test([x=0]()mutable{++x;});这怎么可能?conststd::function可以包装可变仿函数是否正常? 最佳答

c++ - 在类定义之外为模板类定义 operator[]()(数组订阅)

我认为这很容易,但它并没有按我预期的方式工作。这里的正确语法是什么?TemplateClass.htemplateclassTemplateClass{T&operator[](size_tn);TemplateClass.cpp#include"TemplateClass.h"templateT&TemplateClass::operator[](size_tn){//memberdeclarationnotfound} 最佳答案 您需要提供整个类名——包括模板参数:templateT&TemplateClass::operato