小编Ben*_*min的帖子

使用gcc 4.3是std :: string thead-safe吗?

我正在开发一个在Linux上运行的多线程程序(用G ++ 4.3编译),如果你搜索一下,你会发现很多关于std :: string与GCC不是线程安全的可怕故事.这可能是因为它在内部使用了写入时复制,这会对像Helgrind这样的工具造成严重破坏.

我做了一个小程序,将一个字符串复制到另一个字符串,如果你检查两个字符串,它们都共享相同的内部_M_p指针.当一个字符串被修改时,指针会发生变化,因此写入时复制的东西工作正常.

我担心的是,如果我在两个线程之间共享一个字符串(例如将它作为一个对象传递给两个线程之间的线程安全数据队列)会发生什么.我已经尝试使用'-pthread'选项进行编译,但这似乎没有太大区别.所以我的问题:

  • 有没有办法强制std :: string是线程安全的?我不介意是否禁用了写时复制行为来实现这一点.
  • 别人怎么解决这个问题?还是我是偏执狂?

我似乎无法找到明确的答案,所以我希望你们能帮助我..

编辑:

哇,在这么短的时间内,这是很多答案.谢谢!当我想禁用COW时,我肯定会使用Jack的解决方案.但现在主要问题变成:我真的必须禁用COW吗?或者COW线程的"簿记"是否安全?我目前正在浏览libstdc ++源代码,但这需要相当长的时间来弄清楚......

编辑2

好了,浏览了libstdc ++源代码,我在libstd ++中找到了类似的东西--v3/include/bits/basic_string.h:

  _CharT*
   _M_refcopy() throw()
   {
#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
     if (__builtin_expect(this != &_S_empty_rep(), false))
#endif
            __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
     return _M_refdata();
   }  // XXX MT
Run Code Online (Sandbox Code Playgroud)

因此,参考计数器肯定有一些关于原子变化的东西......

结论

我将sellibitze的评论标记为答案,因为我认为我们已经得出结论,这个领域目前尚未解决.为了规避COW的行为,我建议Jack Lloyd回答.谢谢大家的有趣讨论!

c++ string multithreading

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

Linux内核2.6中的计时

我已经阅读了"Linux设备驱动程序"中的第7章(可以在这里找到),时间可以用'jiffies'来衡量.股票jiffies变量的问题在于它经常包裹(特别是如果你将CONFIG_HZ设置为1000).

在我的内核模块中,我将保存一个jiffies值,该值将在未来某个时间设置,并在以后将其与当前的"jiffies"值进行比较.我已经知道有些函数会考虑32位jiffy包装,所以比较我正在使用的两个值:

if (time_after(jiffies, some_future_jiffies_value))
{
   // we've already passed the saved value
}
Run Code Online (Sandbox Code Playgroud)

我的问题出现了:现在我想将'some_future_jiffies_value'设置为"now + 10ms".这可以通过以下方式轻松完成:

some_future_jiffies_value = jiffies + msecs_to_jiffies(10);
Run Code Online (Sandbox Code Playgroud)

它是否正确?如果当前的jiffies接近MAX_JIFFY_OFFSET并且msecs_to_jiffies(10)的结果值使some_future_jiffies_value超过该偏移量会发生什么?它是自动回绕还是我应该添加一些代码来检查这个?是否有功能可以让我不必处理这个问题?

更新:

为了避免环绕的东西,我重写了我的睡眠循环:

   // Sleep for the appropriate time
   while (time_after(some_future_jiffies_value, jiffies))
   {
      set_current_state(TASK_INTERRUPTIBLE);
      schedule_timeout(1);
   }
Run Code Online (Sandbox Code Playgroud)

我认为这更便携吗?

更新2:

非常感谢'ctuffli'花时间回到这个问题并提供一些反馈意见.我的内核驱动程序现在工作正常,与你向我提供所有这些提示之前的情况相比,它不那么难看.谢谢!

c linux-kernel

9
推荐指数
1
解决办法
4878
查看次数

标签 统计

c ×1

c++ ×1

linux-kernel ×1

multithreading ×1

string ×1