无锁编程(七) - 实战

时间:2021-07-07 13:38:23

数据与进程对等的处理

场景:某服务需要支持海量用户,在一台物理机器上运行了多个进程/线程。对于数据应该如何处理以保证安全快速的访问数据呢?

解决方案:“分”

分号段

分进程

分端口

分库分表

无锁编程(七) - 实战

单一生产者与单一消费者

场景:

网络接入进程与逻辑处理进程通过共享内存通讯。我们要如何进行设计?

通常的实现:读写加锁

示例:无锁内存队列的实现

无锁编程(七) - 实战

append_data(srcbuf, buflen)

int usedSize = (m_head->size + m_head->endPos – m_head->beginPos) % m_head->size;

int leftSize = m_head->size – usedSize;

if (leftSize < buflen) return -1;

_copy_to_queue();

Int newpos = ….;

m_head->endPos = newpos;

 

take_data(dstbuf, buflen)

if (m_head->beginPos == m_head->endPos) return -1;

_copy_from_queue();

_do_copy_data();

int newpos = ….;

m_head->beginPos = newpos;

 

进程运行中重新加载配置(双缓存)

场景:

1、 进程需要可以动态加载配置,我们需要怎么做?

2、 进一步,如果配置非常复杂,各个配置具有一定的依赖性,配置检查错误的话加载配置将会失败。我们如何设计才能安全、动态、无锁的加载配置?

通常的实现:

重启进程

发送信号

创建管理端口

示例1:直接访问共享内存

无锁编程(七) - 实战

示例2:双配置缓冲区的实现

无锁编程(七) - 实战

代码:

cfg_t* get_cur_cfg

return cfg_list + cur_idx;

load_cfg

int another = 1 – cur_idx;

_load_cfg(cfg_list + another);

cur_idx = another;

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。