草庐IT

@Async失效情况

全部标签

C++11 async 只使用一个核心

我正在尝试在C++中并行化一个长时间运行的函数并使用std::async它只使用一个核心。不是函数的运行时间太短,因为我目前使用的测试数据需要大约10分钟才能运行。根据我的逻辑,我创建了NThreads的Futures(每个Futures都占据循环的一部分而不是一个单独的单元格,因此它是一个很好的长时间运行的线程),每个都将分派(dispatch)一个异步任务。然后在它们被创建之后,程序自旋锁等待它们完成。然而它总是使用一个核心?!这也不是我看顶部并说它看起来大致像一个CPU,我的ZSH配置输出最后一个命令的CPU%,它总是正好100%,从不超过autoNThreads=12;auto

c++ - 在不知道长度的情况下找到数组的中间

Findthemiddleofthestringorarraywithanunknownlength.Youmaynottraversethelisttofindthelength.Youmaynotuseanythingtohelpyoufindthelength-asitis"unknown."(ie.nosizeof(C)orcount(C#)etc...)我有这个问题作为面试问题。我只是想知道答案是什么。我确实问过我是否可以使用sizeof,他说“不,字符串或数组的大小是未知的——你只需要到达中间。”顺便说一句,我不确定这是否真的可以在没有遍历的情况下解决。我几乎觉得他可能想看

c++ - 在不使用 extern "C"的情况下从 C 调用 C++ 函数

是否可以从C代码调用C++DLL中的函数?该函数未声明extern"C"。仅适用于VisualStudio的丑陋的平台相关hack很好。调用约定不应该是一个主要问题,但我该如何处理名称修改。?例如,在VisualStudio中,带有签名voidf()的C++函数的名称被破坏了?f@@YAXXZ,这不是合法的C标识符。(您不需要告诉我应该将C++函数声明为extern"C"。我已经知道了。但我处于无法更改C++代码的情况。) 最佳答案 将违规函数包装在另一个C++函数中,并使用extern"C"声明它。无需为其创建特殊的DLL,只需在

c++ - 这种情况会导致什么结果?它是定义的还是依赖于编译器的?

如果我想给变量赋新值并检查新值是否与旧值相同,我会倾向于避免使用临时变量。我可以做这样的事情吗:if(oldval==(oldval=new_value())){...dosomething}?这种行为是明确定义的还是评估优先语言或编译器相关?我可以试试看结果,但不能保证它也能在其他系统上运行。我是用C++做的,所以这是我最感兴趣的语言,但如果行为在其他语言中是一致的(或不一致的),我想知道。谢谢! 最佳答案 ==的操作数的求值顺序未定义(我假设==未重载)。无法保证oldval会先求值还是oldval=new_value()会先求

c++ - 我可以在不更改 use_count 的情况下将 shared_ptr<T> & 转换为 shared_ptr<T const> & 吗?

我有一个使用boost::shared_ptr的程序s,特别是依赖于use_count的准确性执行优化。例如,假设一个加法运算有两个参数指针lhs和rhs。假设他们都有类型shared_ptr.当需要执行加法时,我会检查use_count,并且如果我发现其中一个参数的引用计数恰好为1,那么我将重新使用它来就地执行操作。如果两个参数都不能重用,我必须分配一个新的数据缓冲区并执行异地操作。我正在处理庞大的数据结构,因此就地优化非常有用。因此,我永远无法复制shared_ptr没有理由,即每个函数都采用shared_ptrs通过引用或const引用以避免扭曲use_count.我的问题是:我

c++ - 我如何在考虑性能的情况下重构此代码?

我有一个性能非常重要的方法(我知道过早的优化是万恶之源。我知道我应该并且我确实分析了我的代码。在这个应用程序中,我每节省十分之一秒就是一个巨大的胜利。)此方法使用不同的启发式方法来生成和返回元素。启发式算法是按顺序使用的:使用第一个启发式算法,直到它不再返回元素,然后使用第二个启发式算法,直到它不再可以返回元素,依此类推,直到使用完所有启发式算法。在每次调用该方法时,我都使用一个开关来移动到正确的启发式。这很丑陋,但效果很好。这是一些伪代码classMyClass{private:unsignedintm_step;public:MyClass():m_step(0){};ElemGe

C++ 在不激活构造函数的情况下分配内存

我正在从一个文件中读取值,我将在读取它们时将其存储在内存中。我在这里读到,在C++中处理内存位置的正确方法是始终使用new/delete,但是如果我这样做:DataType*foo=newDataType[sizeof(DataType)*numDataTypes];然后将为每个创建的实例调用默认构造函数,我不希望这样。我打算这样做:DataType*foo;char*tempBuffer=newchar[sizeof(DataType)*numDataTypes];foo=(DataType*)tempBuffer;但我认为这会是某种类型不安全的东西。那我该怎么办呢?现在在研究这个问

c++ - 在没有参数列表的情况下无效使用模板名称 ‘Matrix’

这是我的Matrix.cpp文件。(有一个单独的Matrix.h文件)#include#include#include"Matrix.h"usingnamespacestd;Matrix::Matrix(intr,intc,Tfill=1){if(r>maxLength||c>maxLength){cerr这给出了以下内容error:invaliduseoftemplate-name‘Matrix’withoutanargumentlist我的代码有什么问题?编辑:矩阵类定义为template编辑:这是我的Matrix.h文件:#include#include#definemaxLen

c++ - Qt/C++ 在没有子类化的情况下重写函数

我想覆盖QWidget的虚函数而不对其进行子类化。在java中是可能的。我找到了这个链接:overridingmethodswithoutsubclassinginJava不确定C++中是否也有方法。有什么想法吗? 最佳答案 没有继承就不能覆盖。链接示例中的代码进行子类化。也许混淆来自于它不使用extends关键字的事实。它创建了XStream的匿名子类并覆盖了它的方法。这样的类也存在于C++中,类似的代码也是可能的。命名约定有点不同。没有名称但有命名实例的类称为未命名†。以下是我对代码的音译,以展示如何在C++中使用未命名类来完成

c++ - 为什么人们在拥有 C++ 的情况下仍然使用 C?

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。我的问题是,为什么人们在拥有C++的情况下仍然使用C?我学习了C,因为它被认为是程序员交流的语言,并且推荐任何程序员都知道。然后我转到了C++,我现在想,为什么人们仍然使用C并用C编程?据我所知,C++更强大(其中包含OOP方面),它与C一样快,而且总体上似乎更好。我见过人们不喜欢C++,因为用它编写代码太难了。