检查函数内的当前线程是否正常?

时间:2010-09-13 18:47:02

标签: c++ multithreading

检查函数内的当前线程是否可以?

例如,如果某个非线程安全数据结构只被一个线程更改,并且有一个函数由多个线程调用,则根据当前线程拥有单独的代码路径会很有用。如果当前线程是改变数据结构的线程,则可以直接在函数中更改数据结构。但是,如果当前线程是某个其他线程,则必须延迟实际更改,以便在可以安全执行操作时执行。

或者,使用一些布尔作为函数的参数来分隔不同的代码路径会更好吗?

或做一些完全不同的事情?

您怎么看?

4 个答案:

答案 0 :(得分:6)

你没有太多意义。你说一个非线程安全的数据结构只是被一个线程改变了,但在下一句话中你谈到延迟其他线程对该数据结构所做的任何更改。下定决心。

一般情况下,我建议使用临界区或互斥锁包装对数据结构的访问。

答案 1 :(得分:0)

可以使用诸如读取器/写入器锁之类的动物来区分数据结构的读取器和写入器,但典型情况下的性能优势通常不会带来与其使用相关的额外复杂性。

从你提出问题的方式来看,我猜你是多线程开发的新手。我高度建议坚持使用简化和最常用的方法来确保数据完整性(您在此问题上阅读的大多数书籍/文章都会提到互斥/关键部分的相同用途)。多线程开发非常容易出错,并且很难调试。而且,看起来像“最佳”解决方案通常不会为您带来您可能想到的巨大性能优势。通常最好实现简单的方法,然后担心在事后优化它。

答案 2 :(得分:0)

有一个技巧可以解决,正如你所说,其他线程只会偶尔进行一次更改,尽管它仍然相当hackish:

  • 确保您的“主”线程不会被其他线程中断(优先级更高,非公平调度)
  • 检查你的主题
  • 如果是“主人”,只需更改
  • if other,推迟调度,如果需要推迟中断,进行更改,重新安排调度
  • 真的要测试一下你的设置是否没有问题。

正如您所看到的,如果需求稍微改变,这可能会比使用普通锁更糟糕。

答案 3 :(得分:0)

如上所述,当两个线程需要访问相同数据时,最简单的解决方案是使用一些同步机制(即临界区或互斥)。

如果您的设计中已经有同步,请尝试重复使用它(如果可能),而不是添加更多。例如,如果主线程从同步队列接收其工作,则可能能够让线程2对数据结构更新进行排队。主线程将接收请求,并且无需额外同步即可更新它。

排队概念可以通过Active Object模式从设计的其余部分隐藏。激活对象也可以通过Observer模式将数据结构更改发布到其他感兴趣的线程。