c – 对于简短的共享操作和几个独特的操作,是否有共享互斥的方法
发布时间:2020-12-16 06:52:42 所属栏目:百科 来源:网络整理
导读:众所周知,std :: shared_timed_mutex(C 14)和std :: shared_mutex(C 17)仅比std :: shared_locks(reads-operations)具有std :: mutex的性能优势,并且当std :: shared_locks更多时比std :: unique_locks. 但即使它的大部分都是读操作,并且它们很短,那么std ::
众所周知,std :: shared_timed_mutex(C 14)和std :: shared_mutex(C 17)仅比std :: shared_locks(reads-operations)具有std :: mutex的性能优势,并且当std :: shared_locks更多时比std :: unique_locks.
但即使它的大部分都是读操作,并且它们很短,那么std :: mutex会更快 – 这就是为什么在C 11标准中std :: shared_mutex和std :: shared_timed_mutex没有被立即包括在内. 是否存在某种共享互斥体的方法或实现,它具有优于std :: mutex的性能优势,对于短操作,如果读取不仅仅更多,还有更多如下所示? std :: unique_lock / std :: shared_lock = 1/1 000 000 000 000 对于简短的共享操作和几个独特的操作,是否存在共享互斥的任何方法? 解决方法
可能的方法可能是使用重复数据.这应该与大量的读者和只有少数作家很好地扩展.我不知道它是否比shared_mutex()更快,但它是另一种选择
基本理念: 每个读者都在阅读器上复制,而作者可以修改单独的编写者副本.要提交更改,请将writer-object存储在新的reader-object中,该reader-object将从每个新读取器中获取.下一个提交将存储到现在的旧读者对象中.因此,作者需要等待,直到所有旧读者都释放对此对象的锁定. 简单的例子: struct data{ int a; }; struct secured_data { data read[2]; data write; std::atomic<int> current = 0; std::atomic<int> num_read[2] = 0; std::mutex m; data* read_lock() { // increase reader-counter of current data-object int c = current.load(); num_read[c].fetch_add(1); // return current copy return &read + c; } void read_unlock(data* old) { // decrease the old data-object (which was returned by read_lock()) num_read[old - &read].fetch_sub(1); } data* lock() { m.lock(); // every modification happens on a seperate copy write = read[current.load()]; return &write; } void unlock() { int c; // wait until all readers using an old copy have released their lock do { c = current.load(); } while (num_read[(c + 1) % 2].load() != 0); // copy into new read-object read[(c + 1) % 2] = write; // swap read-object // all readers now use an old version current.store((c + 1) % 2); m.unlock(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |