Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跨线程同步属性的最佳方法 我正在寻找一些关于在C++中同步访问对象属性的最佳方法的建议。应用程序有一个包含10个属性的对象的内部缓存。这些对象将在集合中被请求,然后可以修改它们的属性并重新保存。它们可以在任何给定时间由2-4个线程访问,但访问并不激烈,因此我的选择是:_C++_Multithreading - Fatal编程技术网

跨线程同步属性的最佳方法 我正在寻找一些关于在C++中同步访问对象属性的最佳方法的建议。应用程序有一个包含10个属性的对象的内部缓存。这些对象将在集合中被请求,然后可以修改它们的属性并重新保存。它们可以在任何给定时间由2-4个线程访问,但访问并不激烈,因此我的选择是:

跨线程同步属性的最佳方法 我正在寻找一些关于在C++中同步访问对象属性的最佳方法的建议。应用程序有一个包含10个属性的对象的内部缓存。这些对象将在集合中被请求,然后可以修改它们的属性并重新保存。它们可以在任何给定时间由2-4个线程访问,但访问并不激烈,因此我的选择是:,c++,multithreading,C++,Multithreading,使用临界区锁定每个对象的属性访问器。这意味着有很多关键部分——每个对象一个 请求时返回对象的副本,并具有更新功能,可在适当时锁定单个关键部分以更新对象属性 我认为选项2似乎是最有效的,但我只是想看看我是否遗漏了一个更合适的隐藏第三选项 谢谢, J您不需要关键部分,而是需要互斥 每个对象都有一个互斥对象是完全合理的。在读取或写入任何属性之前锁定互斥锁,然后在完成后快速解锁 当没有争用时,互斥锁的开销非常低。当存在大量争用时,它们肯定会减慢您的程序。首先,我认为您担心的是错误的事情。如何知道锁定或复

使用临界区锁定每个对象的属性访问器。这意味着有很多关键部分——每个对象一个

  • 请求时返回对象的副本,并具有更新功能,可在适当时锁定单个关键部分以更新对象属性

  • 我认为选项2似乎是最有效的,但我只是想看看我是否遗漏了一个更合适的隐藏第三选项

    谢谢,
    J

    您不需要关键部分,而是需要互斥

    每个对象都有一个互斥对象是完全合理的。在读取或写入任何属性之前锁定互斥锁,然后在完成后快速解锁


    当没有争用时,互斥锁的开销非常低。当存在大量争用时,它们肯定会减慢您的程序。

    首先,我认为您担心的是错误的事情。如何知道锁定或复制会导致代码出现瓶颈?关键部分是相当轻量级的,不会造成太多的开销,或者至少没有您想象的那么多。只需使用最轻量级的锁定原语即可。如果您预期您的系统将在多处理器硬件上运行,您甚至可以使用自旋锁


    其次,在性能之前,一定要担心并发模型的简单性(提示:更简单的模型更容易理解、正确和优化)。因此,如果您负担得起,可以复制对象,这将减轻您在对象集上进行复杂转换时处理竞争条件的痛苦,这些转换取决于以前的许多值。

    取决于从对象读取属性所需的时间(我猜它应该相当简单,比如读取int或std::string),您可以使用as#3。它们是同步线程的最快方法。选项#4(仅对int有效)可能是根本不进行锁定,只使用。也许,最有效的解决方案是对所有int使用原子,对简单类型(pod和std::string等简单对象)使用每个属性的自旋锁对于任何更复杂的对象,每个对象都有互斥/CS


    只有探查器才能告诉您哪一个是最好的选择。

    为什么是互斥而不是关键部分?这样两个不同的线程就不能更新同一对象的两个不同属性。呃……您想要一个互斥,它肯定会减慢您的程序吗?@Nick D:就是这样吗?@AOI Karasu,使用互斥来锁定整个对象。我相信如果我们只需要在应用程序线程内进行同步,那么互斥比关键部分的效率要低,当关键部分足够时,互斥就不需要进入内核级别。这听起来不像“缓存”的传统含义;请澄清如果对象已更改?您是否正在考虑某些CA?对不起,be cache我只是说对象已预加载到内存中,而不必从磁盘读取。这与问题基本无关,因此请原谅措辞不当。如果对象更改,我们会检查它是否已更改,并相应地进行处理。