草庐IT

@Async失效情况

全部标签

c++ - "no matching function for call to ‘async(std::launch, <unresolved overloaded function type>, std::string&)’“

我正在尝试使用std::async创建线程,但我不断收到错误“没有匹配函数调用‘async(std::launch,,std::string&)’”在行上ConnectFuture=std::async(std::launch::async,Connect_T,ip);这是产生这种行为的代码:#includeclasslibWrapper{public:voidConnect(std::stringip);voidConnect_T(std::stringip);private:std::futureConnectFuture;};voidlibWrapper::Connect(std

c++ - 如果数据已经在缓存中,非临时存储会发生什么情况?

当您使用非临时存储时,例如movntq,并且数据已经在缓存中,存储会更新缓存而不是写出到内存吗?或者它会更新缓存行并将其写出,驱逐它吗?或者什么?这是一个有趣的难题。假设线程A正在加载包含x和y的缓存行。线程B使用NT存储写入x。线程A写入y。如果B对x的存储可以在A的加载发生时传输到内存,则这里存在数据竞争。如果A看到x的旧值,但X的写入已经发生,那么稍后写入y并最终写回缓存行将破坏不相关的值x。我假设处理器以某种方式阻止了这种情况的发生?如果允许的话,我看不出任何人如何使用NT存储构建可靠的系统。 最佳答案 在多核CPU上(即比

c++ - 在什么情况下 delete 运算符会抛出错误?

在我的链表实现中,删除内部类Node实例的辅助函数deleteNode(Node*)抛出运行时错误,通过“触发断点”在VS2015的本地Windows调试器中。我小心地匹配我的new和delete运算符。范围/引用是否发挥了我没有意识到的作用?即使clear()中存在逻辑错误并且deleteNode()被传递给nullptr,它也不应该抛出错误删除nullptr,然后将nullptr赋值给自己吧?该删除有什么问题?classLinkedList{public:LinkedList():head(nullptr){}~LinkedList(){clear();}voidpush_fron

c++ - 是否可以在不创建临时变量的情况下将 "pass"设置为未命名参数?

我正在使用未命名参数编写一个简单的基于类型的调度程序,我想这是很正常的事情。当真正调用该函数时,我想在手头没有任何变量的情况下进行重载。可能吗?例如voidf1(int/*canchangethetype*/){}intmain(int,char*){f1(/*whattoputhere?*/);return0;}我的“真实”示例是一个简单的基于类型的调度程序。我想出的最好的办法是将指针作为未命名参数,我认为它的开销可能最少:#includeusingnamespacestd;templateclassA{public:A(constU&u):u(u){};templateTget_a

c++ - 为什么即使使用指定的 std::launch::async 标志,std::async 也会同步调用该函数

我传递给std::async的函数打印当前线程ID。尽管使用std::launch::async标志调用,它仍打印相同的theadid。这意味着它同步调用该函数。为什么?voidPrintThreadId(){std::cout输出是:2093620936209362093620936环境:VS2015,W7。提前致谢! 最佳答案 您实际上通过等待每个调用来序列化调用,因此可以重复使用同一个线程而不会破坏std::future由不同于调用者线程当以下代码显示与其他代码相同的CallerThreadId时,请唤醒我们:voidPrin

c++ - 在这种情况下,C++ 中的 union 做了什么?

在我工作的其中一个类中,我在头文件中发现了类似这样的内容://Flagsunion{DWORD_flags;struct{unsigned_fVar1:1;unsigned_fVar2:1;unsigned_fVar3:1;unsigned_fVar4:1;};};在一些类的成员函数中,我看到_flags被直接设置为_flags=3;。我还看到结构中的成员被直接设置,例如_fVar1=0并与之进行比较。我正在尝试删除_fVar1,我不确定它会对访问_flags和其他_fVar#的其他地方做什么或设置。例如,设置_flags=3是否意味着_fVar1和_fVar2将为1而_fVar3和_

c++ - 竞争条件的棘手情况

我有一个音频播放类的竞争条件,每次我开始播放时我将keepPlaying设置为true,而false当我停下来。问题发生在我开始后立即停止(),并且keepPlaying标志设置为false,然后重置为true再次。我可以延迟stop(),但我认为这不是一个很好的解决方案。我是否应该使用条件变量让stop()等待直到keepPlaying为true?您通常会如何解决这个问题?#include#includeusingnamespacestd;classAudioPlayer{boolkeepRunning;threadthread_play;public:AudioPlayer(){k

c++ - 如果将变量设置为新对象,旧对象会发生什么情况?

假设我们有一个类X,它没有有一个重载的operator=()函数。classX{intn;X(){n=0;}X(int_n){n=_n;}};intmain(){Xa;//(1)anobjectgetsconstructedhere//morecode...a=X(7);//(2)anotherobjectgetsconstructedhere(?)//somemorecode...a=X(12);//(3)yetanotherobjectconstructedhere(?)return0;}是否在(2)处构造了一个新对象?如果是,在(1)处构造的旧对象会发生什么情况?它是自动销毁还是

c++ - CMake:如何在安装了 VS2017 的情况下指定 VS2015.3 工具集

我安装了VS2017,同时安装了VS2017(v141)和VS2015.3(v140)工具集。我需要使用CMake生成一个解决方案,我希望CMake被“愚弄”,就像安装了VS2015一样,这样我就可以使用v140工具集构建项目。我知道这个问题可能与以下问题重复:Howcmakespecify"PlatformToolset"foraVisualStudio2015project?但它提供的解决方案对我没有帮助。错误信息是:SelectingWindowsSDKversion10.0.14393.0totargetWindows10.0.15063.TheCcompileridentif

c++ - 是否可以在没有显式特化的情况下调用可变参数模板函数?

我正在尝试编写一个函数来为可变参数模板函数转发参数,类似于std::invoke.这是代码:#includetemplatevoidf(Args&&...args){}templateclassF,class...Args>voidinvoke(Ff,Args&&...args){f(std::forward(args)...);}intmain(){invoke(f,1,2,3);std::invoke(f,1,2,3);}但是,我的invoke和std::invoke无法编译。g++提示它无法推断模板参数templateclassF.那么是否可以在没有显式模板特化的情况下调用可变参