小编Dar*_*uuk的帖子

跟踪pthread调度

我想要做的是创建一些图表,详细说明Linux中(两个)线程的执行情况.我不需要看看线程做什么,只是在它们被安排的时间以及基本的时间线多长时间.

我花了最近几个小时在互联网上寻找跟踪pthreads安排的方法.不幸的是,我发现的两个项目需要内核重新编译(LTTng)或glibc修补(NPTL跟踪工具),这两个我都做不到(大型集中管理系统,我没有sudo权限).

有没有其他方法可以做这样的事情,还是我不得不求助于找到一台我可以修补/重新编译我想要的笔记本电脑?

最好的祝福

PS:我会链接到这两个项目,但该网站不允许我(声誉<10).谷歌在项目名称上的第一个搜索结果是正确的.

linux multithreading trace

12
推荐指数
1
解决办法
1726
查看次数

linux终端应用程序中基于像素的图形

我正在开发一个C++应用程序,它将在无头服务器上运行并跟踪一些统计信息.应用程序将在屏幕会话中的终端中运行,以便我可以通过SSH登录并检查这些统计信息.

现在,我想要做的是显示各种数据的图表.为此,我当然需要像素每像素访问,这对于ncurses或S-Lang是不可能的.我发现了DirectFB(它是C++包装器DFB ++++ DFB),但是如果可以在终端内绘制图形,似乎无法找到确凿的证据.

DirectFB是走的路吗?如果没有创建额外的窗口,它会在屏幕会话中正常工作吗?如果没有,那里有没有可以达到我想要的库?

编辑:理想情况下,我当然更喜欢一个具有某种小部件支持的库,这样我就不必创建大量的类来模拟文本字段/滚动条/ ...

c++ linux graphics

7
推荐指数
1
解决办法
3025
查看次数

编译错误 - 使用const成员设置std :: set

我不能为我的生活弄清楚这段代码有什么问题:

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)

c++

6
推荐指数
2
解决办法
2725
查看次数

LLVM:-Wno-ignored-qualifiers 等价物?

使用 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 变量修复了这个问题。

gcc llvm clang

5
推荐指数
1
解决办法
3117
查看次数

生成所有多集大小n分区的算法

我一直试图想出一种方法来生成多重集的所有不同大小的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)

请注意,顺序无关紧要,即以下所有内容都是重复的,不正确的解决方案.

不是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)

language-agnostic algorithm

5
推荐指数
1
解决办法
434
查看次数

std :: set of boost :: weak_ptr <T> - 将const_iterator变为const T?

我有包含类std::setboost::weak_ptr<T>.我有两个函数begin()和end()返回容器的迭代器.但是,我不希望客户能够修改T.简单地返回一个const_iterator将无法正常工作,因为T指向的boost::weak_ptr将是可编辑的.

我想要做的是返回const_iteratorstd::set<boost::weak_ptr<T const> >.铸造std::set<boost::weak_ptr<T> >::const_iterator不起作用.有没有办法得到我想要的行为?

c++ boost iterator weak-ptr

2
推荐指数
1
解决办法
1021
查看次数

无法使用 enable_if 和 is_base_of 区分模板特化

我正在尝试将一些运行时检查换成编译时检查,以识别具有模板特化的对象的基类。

代码编译得很好,但我不明白为什么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)

c++ enable-if template-meta-programming

2
推荐指数
1
解决办法
33
查看次数

C++17 - 可变参数模板参数 - 使用模板参数调用前一个返回值的类方法

我有这个代码:

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。 …

c++ variadic-templates c++17

2
推荐指数
1
解决办法
95
查看次数