我想要做的是创建一些图表,详细说明Linux中(两个)线程的执行情况.我不需要看看线程做什么,只是在它们被安排的时间以及基本的时间线多长时间.
我花了最近几个小时在互联网上寻找跟踪pthreads安排的方法.不幸的是,我发现的两个项目需要内核重新编译(LTTng)或glibc修补(NPTL跟踪工具),这两个我都做不到(大型集中管理系统,我没有sudo权限).
有没有其他方法可以做这样的事情,还是我不得不求助于找到一台我可以修补/重新编译我想要的笔记本电脑?
最好的祝福
PS:我会链接到这两个项目,但该网站不允许我(声誉<10).谷歌在项目名称上的第一个搜索结果是正确的.
我正在开发一个C++应用程序,它将在无头服务器上运行并跟踪一些统计信息.应用程序将在屏幕会话中的终端中运行,以便我可以通过SSH登录并检查这些统计信息.
现在,我想要做的是显示各种数据的图表.为此,我当然需要像素每像素访问,这对于ncurses或S-Lang是不可能的.我发现了DirectFB(它是C++包装器DFB ++和++ DFB),但是如果可以在终端内绘制图形,似乎无法找到确凿的证据.
DirectFB是走的路吗?如果没有创建额外的窗口,它会在屏幕会话中正常工作吗?如果没有,那里有没有可以达到我想要的库?
编辑:理想情况下,我当然更喜欢一个具有某种小部件支持的库,这样我就不必创建大量的类来模拟文本字段/滚动条/ ...
我不能为我的生活弄清楚这段代码有什么问题:
ClassA & doSomething (std::set<boost::shared_ptr<ClassB const> const > const & someSet)
{
std::set<boost::shared_ptr<ClassB> > secondSet;
for (std::set<boost::shared_ptr<ClassB const> const >::const_iterator it = someSet.begin(); it != someSet.end(); it++)
{
if (checkSomething(*it))
secondSet.insert(boost::const_pointer_cast<ClassB>(*it));
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我从g ++的第4行(for循环的开始)得到以下错误:
/usr/include/c++/4.4/ext/new_allocator.h:79: error: ‘const _Tp* __gnu_cxx::new_allocator<_Tp>::address(const _Tp&) const [with _Tp = const boost::shared_ptr<const ClassB>]’ cannot be overloaded
/usr/include/c++/4.4/ext/new_allocator.h:76: error: with ‘_Tp* __gnu_cxx::new_allocator<_Tp>::address(_Tp&) const [with _Tp = const boost::shared_ptr<const ClassB>]’
Run Code Online (Sandbox Code Playgroud)
如果我将std::set
声明更改为包含非const,boost::shared_ptr
则代码编译完美,但这意味着我将无法在代码中强制执行const-correctness.
有没有人知道可能导致这些错误的原因是什么?我没有运气就搜索了Google和StackOverflow.
这是一个最小(非)工作示例:
#include <set>
#include <boost/shared_ptr.hpp>
class ClassB;
class ClassA
{
public: …
Run Code Online (Sandbox Code Playgroud) 使用 GCC,当-Wall -Wextra
启用标志时,可以选择禁用以下警告-Wno-ignored-qualifiers
:
warning: 'const' type qualifier on return type has no effect
Run Code Online (Sandbox Code Playgroud)
有没有办法用 LLVM/Clang 实现相同的行为?我用谷歌搜索,但只找到了一些关于如何添加此错误报告功能的补丁相关页面。没有关于如何禁用它。
我正在使用 LLVM & Clang 3.0 版(从 SVN 源构建)。
注意:我打算在 SuperUser 上发布这个,但是那里没有一个关于 Clang 的问题,也没有 LLVM 标签,所以这让我很沮丧。如果这个问题无论如何都应该存在,请随意移动它。
[编辑]当我从终端运行我的 Makefile 时,似乎可以识别该选项。但是,当从 Eclipse (Helios) 运行时,它不会被识别。
【解决方法】找到了。显然,问题是 Eclipse(在 Ubuntu 下)是由 root 启动的。为什么会这样,我不知道,但效果是 $PATH 变量包含 root 将拥有的内容,而不是启动 Eclipse 的用户将拥有的内容。因此,Eclipse 使用的是较旧的系统范围内安装的 Clang (2.80) 版本。在 Project Properties -> C/C++ Build -> Environment 中添加正确的 PATH 变量修复了这个问题。
我一直试图想出一种方法来生成多重集的所有不同大小的n分区,但到目前为止空手而归.首先让我展示一下我想要实现的目标.
假设我们有一个输入向量uint32_t
:
std::vector<uint32_t> input = {1, 1, 2, 2}
Run Code Online (Sandbox Code Playgroud)
让我们说我们想要创建所有不同的2大小分区.其中只有两个,即:
[[1, 1], [2, 2]], [[1, 2], [1, 2]]
Run Code Online (Sandbox Code Playgroud)
请注意,顺序无关紧要,即以下所有内容都是重复的,不正确的解决方案.
重复,因为排列组中的顺序无关紧要:
[[2, 1], [1, 2]]
Run Code Online (Sandbox Code Playgroud)重复,因为组的顺序无关紧要:
[[2, 2], [1, 1]]
Run Code Online (Sandbox Code Playgroud)不是BTW的某种功课.我在工作时编写了一些东西时遇到过这种情况,但到现在为止,我想知道如何处理这个问题是出于个人兴趣.与工作相关的问题的参数足够小,产生几千个重复的解决方案并不重要.
为了说明我不是在没有尝试提出解决方案的情况下提出要求,让我尝试解释一下我当前的算法(当与多个集合一起使用时会产生重复的解决方案).
它的工作原理如下:状态有一个bitset,每个分区块的n位设置为1.位组的长度是size(input) - n * index_block()
,例如,如果输入向量具有8个元素并且n = 2,则第一个分区块使用8位位组,其中2位设置为1,下一个分区块使用6位位组2位设置为1等
通过按顺序迭代每个位集并从索引等于当前位集中的1位的位置提取输入向量的元素,从这些位集创建分区.
为了生成下一个分区,我以相反的顺序迭代位集.计算下一个bitset排列(使用Gosper的反向).如果未设置当前位集中的第一位(即未选择向量索引0),则该位集复位为其起始状态.强制始终设置第一个位可防止在创建size-n set分区时生成重复项(上面显示的第二类重复项).如果当前位集等于其起始值,则对前一个(更长)位集重复此步骤.
这对于集合来说效果很好(而且非常快).但是,当与多集合一起使用时,它会生成重复的解决方案,因为它不知道两个元素在输入向量中出现多次.这是一些示例输出:
std::vector<uint32_t> input = {1, 2, 3, 4};
printAllSolutions(myCurrentAlgo(input, 2));
=> [[2, 1], [4, 3]], [[3, 1], [4, 2]], [[4, 1], [3, 2]]
std::vector<uint32_t> input = {1, 1, 2, 2};
printAllSolutions(myCurrentAlgo(input, 2));
=> [[1, …
Run Code Online (Sandbox Code Playgroud) 我有包含类std::set
的boost::weak_ptr<T>
.我有两个函数begin()和end()返回容器的迭代器.但是,我不希望客户能够修改T
.简单地返回一个const_iterator
将无法正常工作,因为T
指向的boost::weak_ptr
将是可编辑的.
我想要做的是返回const_iterator
来std::set<boost::weak_ptr<T const> >
.铸造std::set<boost::weak_ptr<T> >::const_iterator
不起作用.有没有办法得到我想要的行为?
我正在尝试将一些运行时检查换成编译时检查,以识别具有模板特化的对象的基类。
代码编译得很好,但我不明白为什么enable_if
语句总是以无效或等于结束,void
因为我总是登陆基本模板结构。
#include <iostream>
#include <type_traits>
using namespace std;
struct BaseOne {};
struct DerivedOne : BaseOne {};
struct BaseTwo {};
struct DerivedTwo : BaseTwo {};
struct Default {};
template<typename T, typename = void>
struct get_category_impl {
static constexpr int value = 0;
};
template<typename T>
struct get_category_impl<T, typename enable_if<is_base_of<BaseOne, T>::value, T>::type> {
static constexpr int value = 1;
};
template<typename T>
struct get_category_impl<T, typename enable_if<is_base_of<BaseTwo, T>::value, T>::type> {
static constexpr int value = 2;
};
template<typename …
Run Code Online (Sandbox Code Playgroud) 我有这个代码:
struct Foo{
int sum;
Foo() : sum(0) {}
Foo(int x) : sum(x) {}
Foo bar(int x){
return Foo(sum + 1);
}
Foo bar(std::vector<int> x){
return Foo(sum + 1);
}
Foo bar(const char* str){
return Foo(sum + 1);
}
};
template <typename ... T>
int foo(T ... args){
Foo foo;
//(foo.bar(args), ...);
return foo.sum;
}
int main() {
foo(1, 2, "hello", std::vector<int>());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想像这样创建调用层次结构:
Foo foo;
foo = foo.bar(1);
foo = foo.bar(2);
foo = foo.bar("hello");
Run Code Online (Sandbox Code Playgroud)
基于可变参数模板参数args
。 …