加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读