小编sbi*_*sbi的帖子

函数本地静态const对象的线程安全初始化

这个问题让我质疑我多年来一直遵循的做法.

对于函数本地静态const对象的线程安全初始化,我保护对象的实际构造,但不保护引用的函数本地引用初始化.像这样的东西:

namespace {
  const some_type& create_const_thingy()
  {
     lock my_lock(some_mutex);
     static const some_type the_const_thingy;
     return the_const_thingy;
  }
}

void use_const_thingy()
{
  static const some_type& the_const_thingy = create_const_thingy();

  // use the_const_thingy

}
Run Code Online (Sandbox Code Playgroud)

这个想法是锁定需要时间,如果引用被多个线程覆盖,那么无关紧要.

如果是的话,我会感兴趣的

  1. 在实践中足够安全吗?
  2. 根据规则安全吗?(我知道,目前的标准甚至不知道"并发"是什么,但是如何践踏已经初始化的引用呢?还有像POSIX这样的其他标准有什么可说的与此相关吗?)

我想知道这个的原因是我想知道我是否可以保留代码,或者我是否需要回去修复它.


对于探究的头脑:

我使用的许多这样的函数本地静态const对象是在首次使用时从const数组初始化并用于查找的映射.例如,我有一些XML解析器,其中标记名称字符串映射到enum值,因此我可以稍后switch覆盖标记的enum值.


由于我得到了一些关于该做什么的答案,但是没有得到我实际问题的答案(见上文1.和2.),我会对此开始赏金.还是那句话:
我不感兴趣,我能做什么,而不是,我真的想知道这个.

c++ concurrency multithreading static-initialization

19
推荐指数
2
解决办法
6510
查看次数

检测扫描文档中的空白页面

因此,我们需要检测由扫描仪创建的图像是否代表空白页面.在图像处理方面,我已经超出了我的深度,所以我必须由社区运行.

这是我到目前为止所提出的:

  • 空页可以是明显的白色,灰色再生纸或泛黄的旧纸.目前的想法是为页面创建直方图,寻找曲线的急剧增加,并使像素的百分比比这更暗.如果超过阈值,页面可能不为空.

  • 由于这可能会将包含顶部单行文本的页面分类为空,我们会平铺页面并收集有关每个图块的统计信息.

  • 我们需要从绑定中检测扫描的订书机和孔(可能只在某些图块中),但这可以推迟到稍后阶段.但是,如果你知道除了这两个之外还要注意什么,请在评论中提及.

  • 这需要很快.它是文档处理工作流程的一部分,每天处理(数十万)页面.如果处理页面的时间要长十秒,那么我们的客户将不得不告诉他们的客户他们将需要等待几天才能获得结果.(如果这导致更多的误报,一些客户宁愿让某人检查几十个被发现的"空"页面,而不是让他们的客户再等一天.)

所以这是我的问题:

  1. 采取这条路线是不是一个好主意,还是有更好的东西?

  2. 如果我们这样做,我该怎么做?找到页面阈值的好(便宜)算法是什么?我们可以通过为一批文件假设一个类似的门槛来获得显着的速度吗?在记录之前,亮度值可以精确到哪个精度值?我们可以期待什么怪癖?

algorithm image-processing

19
推荐指数
1
解决办法
5643
查看次数

选择任一循环作为外循环是否有优势?

我正在扩展现有的日志记录库.它是一个有两面的系统:前端是任务将日志消息写入的位置,后端是应用程序可以插入侦听器的位置,将这些消息转发到不同的接收器.后端曾经是一个硬连线的监听器,我现在正在扩展这个灵活性.该代码专门用于嵌入式设备,其中高性能(以每毫秒转发的字节数衡量)是非常重要的设计和实现目标.

出于性能原因,消息被缓冲,并且转发在后台任务中完成.该任务从队列中提取一大块消息,将它们全部格式化,然后通过已注册的函数将它们传递给侦听器.这些侦听过滤消息,并且只会将这些消息写入通过过滤条件的接收器.

鉴于此,我最终得到了N发送M消息的通知函数(侦听器),这是一个相当经典的N*M问题.现在我有两种可能性:我可以遍历消息,然后循环通过将消息传递给每个消息的通知函数.

for(m in formatted_messages) 
  for(n in notification_functions)
    n(m);

void n(message)
{
    if( filter(message) )
      write(message);
}
Run Code Online (Sandbox Code Playgroud)

或者我可以循环遍历所有通知函数,并将它们立即传递给我:

for(n in notification_functions)
    n(formatted_messages);

void n(messages)
{
  for(m in messages)
    if( filter(m) )
      write(m);
}
Run Code Online (Sandbox Code Playgroud)

关于哪种设计更有可能允许每个时间片处理更多数量的消息,是否有任何基本考虑因素?(注意这个问题如何决定听众的界面.这不是一个微优化问题,而是一个关于如何使设计不妨碍性能的问题.我只能在很长一段时间后进行测量,然后重新设计监听器接口将会很昂贵.)

我已经做了一些考虑:

  • 那些听众需要在某处写消息,这相当昂贵,因此函数调用本身在性能方面可能不太重要.
  • 在95%的情况下,只有一个听众.

c++ performance loops

19
推荐指数
2
解决办法
346
查看次数

什么是int&mean

一个C++问题,

我知道

int* foo(void)
Run Code Online (Sandbox Code Playgroud)

foo将返回一个指向int类型的指针

怎么样

int &foo(void)
Run Code Online (Sandbox Code Playgroud)

什么回来了?

非常感谢!

c++ types pointers

18
推荐指数
3
解决办法
5万
查看次数

多个线程和CPU缓存

我正在使用多个线程在C中实现图像过滤操作,并使其尽可能优化.我有一个问题:如果一个内存被thread-0访问,并且如果同一个内存被thread-1访问,它是否会从缓存中获取它?这个问题源于这两个线程可能运行到CPU的两个不同核心的可能性.所以另一种方法是:所有内核是否共享相同的公共缓存?

假设我有如下的内存布局

int输出[100];

假设有2个CPU核心,因此我产生两个线程同时工作.一种方案可以是将内存分成两个块,0-49和50-99,并让每个线程在每个块上工作.另一种方法是让线程0在偶数索引上工作,比如0 2 4等等.而另一个线程工作在奇数索引上,比如1 3 5 ......这个后来的技术更容易实现(特别是对于3D)数据)但我不确定我是否可以通过这种方式有效地使用缓存.

c multithreading caching

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

模式,以避免dynamic_cast

我有一节课:

class A 
{
public:
  virtual void func() {...}
  virtual void func2() {...}
};
Run Code Online (Sandbox Code Playgroud)

还有一些来自这个的派生类,比方说B,C,D ...在95%的情况下,我想要遍历所有对象并调用func或func2(),因此我将它们放在向量中,如:

std::vector<std::shared_ptr<A> > myVec;
...
for (auto it = myVec.begin(); it != myVec.end(); ++it)
  (*it).func();
Run Code Online (Sandbox Code Playgroud)

但是,在剩下的5%的情况下,我想根据它们的子类做一些不同的类.我的意思完全不同,比如调用带有其他参数的函数或者根本不为某些子类调用函数.我想到了一些解决这个问题的方法,我都不喜欢这个方案:

  • 使用dynamic_cast来分析子类.不好,太慢,因为我经常在有限的硬件上打电话
  • 在每个子类中使用一个标志,如枚举{IS_SUBCLASS_B,IS_SUBCLASS_C}.不好,因为它没有感觉到OO.
  • 还将类放在其他向量中,每个向量用于其特定任务.这也不觉得OO,但也许我错了.喜欢:

    std::vector<std::shared_ptr<B> > vecForDoingSpecificOperation;
    std::vector<std::shared_ptr<C> > vecForDoingAnotherSpecificOperation;
    
    Run Code Online (Sandbox Code Playgroud)

那么,有人可以建议一种能达到我想要的风格/模式吗?

c++ oop c++11

18
推荐指数
2
解决办法
9374
查看次数


C++中函数内的静态变量 - 即使函数没有运行也会分配?

我一直在网上阅读C++,这是我无法找到答案的一件事.

我知道函数中使用的静态变量类似于全局变量,并且该函数的后续调用将使静态变量在调用之间保持其值.

但是,如果从未调用该函数,静态变量是否会被分配?

谢谢

c++ static memory-management

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

如何在Linux中为文件提供写入权限?

我如何(以编程方式)将文件的写权限授予Linux中的特定用户?比如,它的拥有者?每个人都有对此文件的读取权限.

c linux

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

如何安全地从流中读取unsigned int?

在以下程序中

#include <iostream>
#include <sstream>

int main()
{
    std::istringstream iss("-89");
    std::cout << static_cast<bool>(iss) << iss.good() << iss.fail() << iss.bad() << iss.eof() << '\n';
    unsigned int u;
    iss >> u;
    std::cout << static_cast<bool>(iss) << iss.good() << iss.fail() << iss.bad() << iss.eof() << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

流lib将一个有符号的值读入一个unsigned int甚至没有打嗝的情况下,默默地产生错误的结果:

11000
10001
Run Code Online (Sandbox Code Playgroud)

我们需要能够捕获那些运行时类型不匹配错误.如果我们还没有在模拟中发现这一点,这可能会炸毁非常昂贵的硬件.

我们如何安全地从流中读取无符号值?

c++ iostream

17
推荐指数
3
解决办法
1936
查看次数