小编Abr*_*ile的帖子

C++跨平台进程:POCO lib好吗?其他选择?

我想使用一些跨平台的C++库来启动,停止和获取进程的标准输出.我发现并且我想使用C++ POCO库:这些好吗?

什么是最好的选择?我使用Boost并且他们有Boost Process,但不是官方发布和AFAIK的一部分它不会很快(发展在2008年停止).你能告诉我一下这个POCO lib或其他吗?

c++ poco-libraries

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

在不使用条件变量的情况下唤醒线程的最快方法

我试图通过设置后台线程来解决一个特定任务来加速一段代码.当我需要解决我的任务时,我想唤醒这些线程,完成工作并再次阻止它们等待下一个任务.任务总是一样的.

我尝试使用条件变量(和需要与它们一起使用的互斥量),但我最终减慢了代码速度,而不是加快速度; 主要是因为调用所有需要的函数非常昂贵(pthread_cond_wait/pthread_cond_signal/pthread_mutex_lock/pthread_mutex_unlock).

使用线程池没有任何意义(我没有),因为它是一个过于通用的构造; 在这里,我只想解决我的具体任务.根据实现情况,我还会为队列支付性能损失.

你有什么建议可以快速叫醒而不使用mutexcon_var吗?

我正在考虑设置线程,如定时器读取atomic variable; 如果变量设置为1,则线程将完成工作; 如果它被设置为0,它们将进入睡眠状态几微秒(我会以微秒睡眠开始,因为我想避免使用spinlocks它,这可能对CPU来说太昂贵).你怎么看待这件事?任何建议都非常感谢.

我使用的是Linux,gcc,C和C++.

c c++ performance multithreading atomic

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

具有未命名命名空间的名称空间,声明了相同的变量

我在下面尝试了这个虚拟代码来测试未命名的命名空间.

我有以下输出

 ctor 1
 ctor 0
 3
 5
Run Code Online (Sandbox Code Playgroud)

我对此有点困惑.

  1. 我期待编译器的错误,说它无法解决关于的歧义a::m_a.相反,它总是指较少的嵌套.总是这样吗?C++遵循什么规则?
  2. 似乎编译器按照写在文件上的顺序创建变量CMyObj.总是这样吗?
  3. 有没有办法m_amain()?获取最嵌套的变量?
class CMyObj{     
    public:
    CMyObj(int a){std::cout  << "ctor " << a << std::endl; }
 };
 namespace a{ 
      namespace{
           int m_a=4;
           int m_b=5;
           CMyObj m_obj(1);
      }  
 }
 namespace a{
      int m_a=3;
      CMyObj m_obj(0);
 }
 int main(){
      std::cout << a::m_a << std::endl; // which one?
      std::cout << a::m_b << std::endl; // how this is possible?
      return 0;
 }
Run Code Online (Sandbox Code Playgroud)

c++ namespaces

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

Boost Type Erasure的实践和发现

我正在阅读boost type erasure,我正在试图找出潜在的用途.我想读一些关于这个主题的文档(它看起来很大),我想练习一下.引用最多的应用程序区域是在客户端和服务器之间联网/交换数据.你可以建议一些其他的例子或练习,我可以玩这个图书馆吗?

c++ boost type-erasure

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

现在是否值得实施slab分配器?

我正在一台服务器上工作,必须从同时连接的数千个套接字客户端读取.客户端请求由具有大约32字节的所有相同精确大小的消息构成.

我正在阅读关于这个问题,slab allocator并且当我调用read从套接字中获取数据时,我想将这种特殊技术用于我的应用程序(将read数据从内核缓冲区复制到我选择的缓冲区中,我想使用一些内存动态分配).

在我阅读时,似乎Linux内核已经在使用这种技术了.如果用于实现malloc or new,那么鉴于分配已经具有性能,我仍然值得这样做吗?

我认为在没有SLAB算法的情况下使用堆栈分配可能会更好,但我不确定哪种方法最好.

c sockets linux memory performance

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

在gdb中调试应用程序输出的问题

我正在TUI模式下使用GDB执行我的第一步.

在调试会话期间,我看到输出到控制台的每一行都出现在一行中(在您看到的图中222222以红色突出显示).这就像拥有一行的输出窗格.

最重要的是,每个\n都不清理该行,因此所有字符串都会相互覆盖,使我的输出非常混乱.

你能帮我解决一下这个问题,还是指点一些关键命令来寻找干净的输出?

我还突出显示了另一个区域(图中1111111),因为第一个字符串是在那里输出的,然后是源代码窗口框架上的所有其他字符串.

替代文字

debugging gdb

6
推荐指数
1
解决办法
1675
查看次数

在#define中打印变量名

我试图在调试(日志记录)时使用宏来显示控制台,显示成员值的变量名称.怎么做?我尝试了以下但它不起作用.

#define MY_PRINT(x) std::cout << "'x'=" << x << std::endl;

int main(){
   int my_variable=3;
   MY_PRINT( my_variable );
   // I would like to print to console
   // 'my_variable'=3
}
Run Code Online (Sandbox Code Playgroud)

c++ macros console-application

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

在崩溃后仍然获得了名为mutex的提升进程

我正在使用boost::interpocess::scoped_locka named_mutex和a timeout; 我在Linux OS中运行.

在我的一次测试中,我遇到了崩溃:从那时起,每当我再次尝试运行应用程序时,它就会卡在我创建锁的位置; 看起来互斥体仍然以某种方式获得(没有可能使用它的进程正在运行).

最重要的是,如果你看下面的代码,我希望在150微秒后,定时scoped_lock返回给我一个错误..但事实并非如此......只是挂在那里.

      #include <boost/interprocess/sync/named_mutex.hpp>
      namespace bi = boost::interprocess;
      bi::named_mutex m_mutex;

 try{
      boost::posix_time::ptime pt( 
          boost::posix_time::microsec_clock::local_time() ) ;

      pt+= boost::posix_time::microseconds( 150 );
      bi::scoped_lock< bi::named_mutex > lock( m_mutex, pt );

      if( !lock.owns() ){
        FATAL( "I didn't acquire the lock." );
           return EXIT_FAILURE;
      }
     ....
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  1. 如何确保boost::interprocess命名的互斥锁被销毁?(那么如何在进程中查看共享的互斥锁以及如何销毁它们)
  2. 为什么获取互斥锁不会在150微秒后返回?这下面的代码中有什么问题吗?

非常感谢

AFG

synchronization mutex ipc interprocess boost-interprocess

6
推荐指数
1
解决办法
2783
查看次数

当字符串超出范围时,将string :: c_str()分配给const char*

我对基本的C++用法有疑问.下面的代码,使用gcc/LInux编译,正确打印出来.

字符串test超出范围所以它的c_str()值也应该是无效的不是吗?我错了还是误解了const char*意思?

   #include <iostream>
   int main(){
     const char* a = "aaaa";
       std::cout << a;
       { std::string test("bbbb");a=test.c_str();}
       std::cout << a;
       a = "cccc";
       std::cout << a;
   }


   aaaabbbbcccc
   // print out without any problem
Run Code Online (Sandbox Code Playgroud)

c++ string constants char

6
推荐指数
1
解决办法
1198
查看次数

错误在程序中迷失'#'

我想根据是否-std=c++0x使用来定义一个宏.如果我尝试下面的宏我有错误error stray '#' in program.

下面的代码是否错误/是否允许C++ #if / #endif 在a中使用预处理器#define

   #define DEF_ME (p) \
   #if  __GXX_EXPERIMENTAL_CXX0X__ \
   #endif
Run Code Online (Sandbox Code Playgroud)

我在Linux中使用g ++ 4.4.7.

c++ macros g++ c-preprocessor

6
推荐指数
1
解决办法
4462
查看次数