小编Jos*_*vin的帖子

随着更多CPU的添加,原子操作会变慢吗?

x86和其他体系结构提供了特殊的原子指令(lock,cmpxchg等),允许您编写"无锁"数据结构.但随着越来越多的内核被添加,似乎这些指令实际上必须在幕后进行的工作将会增长(至少是为了保持缓存一致性?).如果原子添加在双核系统上今天需要大约100个周期,那么未来的80多个核心机器上可能需要更长的时间吗?如果您要将代码编写为最后一个,那么即使它们今天变慢,使用锁实际上是否更好?

multithreading caching locking atomic lock-free

17
推荐指数
2
解决办法
3677
查看次数

JVM是否为每个对象创建一个互斥锁以实现'synchronized'关键字?如果没有,怎么样?

作为一个越来越熟悉Java的C++程序员,看到语言级别支持锁定任意对象而没有任何声明对象支持这种锁定,这有点奇怪.为每个对象创建互斥锁似乎是一个自动选择的高成本.除了内存使用,互斥体在某些平台上是OS有限的资源.如果互斥锁不可用但你的性能特征明显不同,你可以旋转锁定,我希望这会损害可预测性.

在所有情况下,JVM是否足够智能以识别特定对象永远不会成为synchronized关键字的目标,从而避免创建互斥锁?可以懒惰地创建互斥锁,但是这会引发自举需要互斥锁的自举问题,即使解决了这个问题,我也认为仍然需要一些开销来跟踪是否已经创建了互斥锁.所以我假设如果这样的优化是可能的,它必须在编译时或启动时完成.在C++中,由于编译模型这样的优化是不可能的(你不知道对象的锁是否会跨库边界使用),但我对Java的编译和链接知道不够了解如果适用相同的限制.

c++ java implementation synchronization jvm

17
推荐指数
1
解决办法
2702
查看次数

为什么std :: cout将volatile指针转换为bool?

如果你试图cout指向volatile类型的指针,即使是你通常希望cout打印字符串的volatile指针,你只需要得到'1'(假设指针不是null我认为).我假设输出流operator <<是专门用于volatile指针的模板,但我的问题是,为什么?什么用例激发了这种行为?

示例代码:

#include <iostream>
#include <cstring>

int main()
{
    char x[500];
    std::strcpy(x, "Hello world");

    int y;
    int *z = &y;

    std::cout << x << std::endl;
    std::cout << (char volatile*)x << std::endl;

    std::cout << z << std::endl;
    std::cout << (int volatile*)z << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Hello world
1
0x8046b6c
1
Run Code Online (Sandbox Code Playgroud)

c++ pointers iostream standards-compliance volatile

16
推荐指数
2
解决办法
2135
查看次数

线程本地存储在哪些平台上有限,有多少可用?

我最近意识到线程本地存储在某些平台上是有限的.例如,C++库boost :: thread read的文档:

"注意:可以创建的特定于线程的存储对象的数量存在特定于实现的限制,并且此限制可能很小."

我一直在寻找尝试找出不同平台的限制,但我找不到权威表.如果您正在编写使用TLS的跨平台应用程序,这是一个重要问题.Linux是我找到信息的唯一平台,以Ingo Monar补丁的形式在2002年发送到内核列表添加TLS支持,他提到"TLS区域的数量是无限的,并且没有相关的额外分配开销支持TLS." 如果在2009年仍然如此(是吗?)非常漂亮.

但是今天Linux怎么样?OS X?视窗?的Solaris?嵌入式操作系统?对于在多种体系结构上运行的操作系统,它是否因架构而异?

编辑:如果您对可能存在限制的原因感到好奇,请考虑预先分配线程本地存储的空间,因此您将在每个线程上支付费用.面对很多线程,即使是少量也是一个问题.

c++ multithreading cross-platform boost-thread thread-local

15
推荐指数
2
解决办法
6161
查看次数

如果您原子地更改检查值,条件变量是否仍需要互斥锁?

以下是使用条件变量的典型方法:

// The reader(s)
lock(some_mutex);
if(protected_by_mutex_var != desired_value)
    some_condition.wait(some_mutex);
unlock(some_mutex);

// The writer
lock(some_mutex);
protected_by_mutex_var = desired_value;
unlock(some_mutex);
some_condition.notify_all();
Run Code Online (Sandbox Code Playgroud)

但是,如果通过比较和交换指令原子地设置protected_by_mutex_var,则互斥量是否可用于任何目的(除了pthread和其他API要求您传入互斥锁)?是否保护用于实施条件的状态?如果没有,那么这样做是否安全?:

// The writer
atomic_set(protected_by_mutex_var, desired_value);
some_condition.notify_all();
Run Code Online (Sandbox Code Playgroud)

作者永远不会直接与读者的互斥体互动?请注意,'protected_by_mutex_var'名称不再合适(它不再受互斥保护).如果是这样,甚至有必要让不同的读者使用相同的互斥锁?

c++ multithreading mutex locking condition-variable

15
推荐指数
1
解决办法
3310
查看次数

如何在python中渲染3D直方图?

我想从Hacker's Delight那里制作这样的情节:

在此输入图像描述

有什么方法可以在Python中实现这一目标?一种易于交互式调整图形(改变当前观察到的X/Y切片)的解决方案将是理想的.

matplotlib和mplot3d模块都没有这个功能AFAICT.我发现mayavi2但是它非常笨重(我甚至找不到调整大小的选项)并且从ipython运行时似乎只能正常工作.

或者gnuplot可以工作,但我不想为此学习另一种语言语法.

python plot data-visualization matplotlib mayavi

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

如何将stdout + stderr重定向到一个文件,同时保持流分离?

重定向stdout + stderr,以便在仍然输出到stdout时写入文件都很简单:

cmd 2>&1 | tee output_file
Run Code Online (Sandbox Code Playgroud)

但是现在来自cmd的stdout/stderr都来了stdout.我想将stdout + stderr写入同一个文件(因此,假设cmd是单线程的,则保留排序)但是仍然可以单独重定向它们,如下所示:

some_magic_tee_variant combined_output cmd > >(command-expecting-stdout) 2> >(command-expecting-stderr)
Run Code Online (Sandbox Code Playgroud)

因此,combined_output包含保留顺序的两者,但命令期望-stdout仅获取stdout,而命令期望-stderr仅获取stderr.基本上,我想记录stdout + stderr,同时仍然允许stdout和stderr分别重定向和管道.发球方法的问题在于它们将它们融合在一起.有没有办法在bash/zsh中执行此操作?

unix bash shell zsh tee

14
推荐指数
1
解决办法
6216
查看次数

什么是检测异常的好算法?

背景

这是问题所在:

  1. 黑匣子每天输出一个新号码.
  2. 这些数字已被记录一段时间.
  3. 检测黑盒中的新数字何时落在该时间段内建立的数字模式之外.

数字是整数,时间段是一年.

什么算法会识别数字中的模式?

模式可能很简单,如总是上升或总是下降,或者数字可能在一个狭窄的范围内,等等.

思路

我有一些想法,但不确定最佳方法,或已存在的解决方案:

  • 机器学习算法?
  • 神经网络?
  • 分类正常和异常数字?
  • 统计分析?

algorithm black-box machine-learning prediction

13
推荐指数
2
解决办法
1888
查看次数

C++ 14类型列表,任何理由更喜欢"自由函数"到"方法",反之亦然?

我看到了在C++ 11/14中实现类型列表的两种可能的样式,我很好奇是否有任何理由偏爱另一种.这里概述了第一种技术,并在Boost的MPL库中进行了建模.在这种风格中,您可以定义元"自由函数"(使用声明的顶级),它们接收类型列表并对其进行操作.以下是如何实现std :: transform的元版本,它适用于类型而不是第一种样式中的值:

    template <typename... Args>
    struct type_list;

    namespace impl
    {
        template <template <typename...> class F, class L>
        struct transform_impl;

        template <template <typename...> class F, template <typename...> class L, typename... T>
        struct transform_impl<F, L<T...>>
        {
            using type = L<typename F<T>::type...>;
        };
    }

    template <template <typename...> class F, class L>
    using transform = typename impl::transform_impl<F, L>::type;
Run Code Online (Sandbox Code Playgroud)

第二种方式是定义元'方法'(使用类型列表结构中的声明).以下是变换在该样式中的外观:

    template <typename... Args>
    struct type_list {
        // ... other 'methods'

        template<template<class> class Wrapper>
        using transform =
            type_list<Wrapper<Args>...>;

        // ... …
Run Code Online (Sandbox Code Playgroud)

c++ boost-mpl template-meta-programming c++11 c++14

13
推荐指数
1
解决办法
1067
查看次数

自动化C++类的pimpl - 有一个简单的方法吗?

Pimpl是许多C++代码中的样板来源.它们似乎是宏,模板和一些外部工具帮助可以解决的组合,但我不确定最简单的方法是什么.我已经看到模板有助于完成一些提升但不是很多 - 你仍然需要为你试图包装的类的每个方法编写转发函数.有没有更简单的方法?

我正在想象一个用作制作过程一部分的工具.你希望你的公共标题是pimpl'd类,所以你提供一些输入文件,比如pimpl.in,列出你要包装的类(实现un-pimpl'd),然后检查该文件,生成pimpl类,并且在'make install'期间只安装它们的标题(不是原始类的标题).问题是如果没有完整的C++解析器,我没有看到任何方法可以做到这一点,甚至编译器供应商都无法做到这一点.也许这些类可以用某种方式编写,这使得外部工具的工作变得更容易,但我确信我最终会错过各种角落案例(例如模板化类和/或模板化成员函数).

有任何想法吗?有没有其他人为此问题提供解决方案?

c++ macros templates build-process pimpl-idiom

11
推荐指数
1
解决办法
1324
查看次数