x86和其他体系结构提供了特殊的原子指令(lock,cmpxchg等),允许您编写"无锁"数据结构.但随着越来越多的内核被添加,似乎这些指令实际上必须在幕后进行的工作将会增长(至少是为了保持缓存一致性?).如果原子添加在双核系统上今天需要大约100个周期,那么未来的80多个核心机器上可能需要更长的时间吗?如果您要将代码编写为最后一个,那么即使它们今天变慢,使用锁实际上是否更好?
作为一个越来越熟悉Java的C++程序员,看到语言级别支持锁定任意对象而没有任何声明对象支持这种锁定,这有点奇怪.为每个对象创建互斥锁似乎是一个自动选择的高成本.除了内存使用,互斥体在某些平台上是OS有限的资源.如果互斥锁不可用但你的性能特征明显不同,你可以旋转锁定,我希望这会损害可预测性.
在所有情况下,JVM是否足够智能以识别特定对象永远不会成为synchronized关键字的目标,从而避免创建互斥锁?可以懒惰地创建互斥锁,但是这会引发自举需要互斥锁的自举问题,即使解决了这个问题,我也认为仍然需要一些开销来跟踪是否已经创建了互斥锁.所以我假设如果这样的优化是可能的,它必须在编译时或启动时完成.在C++中,由于编译模型这样的优化是不可能的(你不知道对象的锁是否会跨库边界使用),但我对Java的编译和链接知道不够了解如果适用相同的限制.
如果你试图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++库boost :: thread read的文档:
"注意:可以创建的特定于线程的存储对象的数量存在特定于实现的限制,并且此限制可能很小."
我一直在寻找尝试找出不同平台的限制,但我找不到权威表.如果您正在编写使用TLS的跨平台应用程序,这是一个重要问题.Linux是我找到信息的唯一平台,以Ingo Monar补丁的形式在2002年发送到内核列表添加TLS支持,他提到"TLS区域的数量是无限的,并且没有相关的额外分配开销支持TLS." 如果在2009年仍然如此(是吗?)非常漂亮.
但是今天Linux怎么样?OS X?视窗?的Solaris?嵌入式操作系统?对于在多种体系结构上运行的操作系统,它是否因架构而异?
编辑:如果您对可能存在限制的原因感到好奇,请考虑预先分配线程本地存储的空间,因此您将在每个线程上支付费用.面对很多线程,即使是少量也是一个问题.
以下是使用条件变量的典型方法:
// 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'名称不再合适(它不再受互斥保护).如果是这样,甚至有必要让不同的读者使用相同的互斥锁?
我想从Hacker's Delight那里制作这样的情节:

有什么方法可以在Python中实现这一目标?一种易于交互式调整图形(改变当前观察到的X/Y切片)的解决方案将是理想的.
matplotlib和mplot3d模块都没有这个功能AFAICT.我发现mayavi2但是它非常笨重(我甚至找不到调整大小的选项)并且从ipython运行时似乎只能正常工作.
或者gnuplot可以工作,但我不想为此学习另一种语言语法.
重定向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中执行此操作?
这是问题所在:
数字是整数,时间段是一年.
什么算法会识别数字中的模式?
模式可能很简单,如总是上升或总是下降,或者数字可能在一个狭窄的范围内,等等.
我有一些想法,但不确定最佳方法,或已存在的解决方案:
我看到了在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) Pimpl是许多C++代码中的样板来源.它们似乎是宏,模板和一些外部工具帮助可以解决的组合,但我不确定最简单的方法是什么.我已经看到模板有助于完成一些提升但不是很多 - 你仍然需要为你试图包装的类的每个方法编写转发函数.有没有更简单的方法?
我正在想象一个用作制作过程一部分的工具.你希望你的公共标题是pimpl'd类,所以你提供一些输入文件,比如pimpl.in,列出你要包装的类(实现un-pimpl'd),然后检查该文件,生成pimpl类,并且在'make install'期间只安装它们的标题(不是原始类的标题).问题是如果没有完整的C++解析器,我没有看到任何方法可以做到这一点,甚至编译器供应商都无法做到这一点.也许这些类可以用某种方式编写,这使得外部工具的工作变得更容易,但我确信我最终会错过各种角落案例(例如模板化类和/或模板化成员函数).
有任何想法吗?有没有其他人为此问题提供解决方案?
c++ ×6
locking ×2
algorithm ×1
atomic ×1
bash ×1
black-box ×1
boost-mpl ×1
boost-thread ×1
c++11 ×1
c++14 ×1
caching ×1
iostream ×1
java ×1
jvm ×1
lock-free ×1
macros ×1
matplotlib ×1
mayavi ×1
mutex ×1
pimpl-idiom ×1
plot ×1
pointers ×1
prediction ×1
python ×1
shell ×1
tee ×1
templates ×1
thread-local ×1
unix ×1
volatile ×1
zsh ×1