0

在线程安全和一般安全方面,下面的代码会有什么问题吗?

std::string & toHexString( const uint8_t *buf, uint32_t size, std::string &out ) 
{ 
  // modify 'out'
  return out; 
}

#ifndef TOHEXSTR
    #define TOHEXSTR( x, y, ) ( toHexString( x, y, std::string() ) ).c_str()
#endif

这将使用的方式是打印调试语句:

printf( "Byte buffer contents: [%s].", TOHEXSTR( buf, buf_size ) );

如果这个实现有问题,应该改变什么?

谢谢。

4

2 回答 2

2

不要使用引用参数来存储输出。

只需在函数内部创建一个本地 std::string 并按值返回它。

std::string  toHexString( const uint8_t *buf, uint32_t size ) 
{ 
  std::string out;
  // modify 'out'
  return out; 
}

由于返回值优化等编译器技术,这应该具有相似的性能,但语义要好得多(不需要虚拟的额外参数)。

就线程安全而言,该功能可能很好。你只需要在线程之间共享数据时担心线程安全,这个函数不应该共享任何数据。

于 2012-09-17T17:57:19.247 回答
0

从我们可以看到,该函数本身没有特别的线程安全问题——所以只要outbuf参数的内容在它运行时没有被另一个线程修改,你就可以了。如果您通过该宏或类似方式使用它,那么您不必担心out- 尽管正如 Ethan 的回答所指出的那样,您最好编写一个更干净的函数并只返回字符串,而不是使用宏。

于 2012-09-17T19:07:48.760 回答