检查函数内的当前线程是否可以?
例如,如果某个非线程安全数据结构只被一个线程更改,并且有一个函数由多个线程调用,则根据当前线程拥有单独的代码路径会很有用。如果当前线程是改变数据结构的线程,则可以直接在函数中更改数据结构。但是,如果当前线程是某个其他线程,则必须延迟实际更改,以便在可以安全执行操作时执行。
或者,使用一些布尔作为函数的参数来分隔不同的代码路径会更好吗?
或做一些完全不同的事情?
您怎么看?
答案 0 :(得分:6)
你没有太多意义。你说一个非线程安全的数据结构只是被一个线程改变了,但在下一句话中你谈到延迟其他线程对该数据结构所做的任何更改。下定决心。
一般情况下,我建议使用临界区或互斥锁包装对数据结构的访问。
答案 1 :(得分:0)
可以使用诸如读取器/写入器锁之类的动物来区分数据结构的读取器和写入器,但典型情况下的性能优势通常不会带来与其使用相关的额外复杂性。
从你提出问题的方式来看,我猜你是多线程开发的新手。我高度建议坚持使用简化和最常用的方法来确保数据完整性(您在此问题上阅读的大多数书籍/文章都会提到互斥/关键部分的相同用途)。多线程开发非常容易出错,并且很难调试。而且,看起来像“最佳”解决方案通常不会为您带来您可能想到的巨大性能优势。通常最好实现简单的方法,然后担心在事后优化它。
答案 2 :(得分:0)
有一个技巧可以解决,正如你所说,其他线程只会偶尔进行一次更改,尽管它仍然相当hackish:
正如您所看到的,如果需求稍微改变,这可能会比使用普通锁更糟糕。
答案 3 :(得分:0)
如上所述,当两个线程需要访问相同数据时,最简单的解决方案是使用一些同步机制(即临界区或互斥)。
如果您的设计中已经有同步,请尝试重复使用它(如果可能),而不是添加更多。例如,如果主线程从同步队列接收其工作,则可能能够让线程2对数据结构更新进行排队。主线程将接收请求,并且无需额外同步即可更新它。
排队概念可以通过Active Object模式从设计的其余部分隐藏。激活对象也可以通过Observer模式将数据结构更改发布到其他感兴趣的线程。