zoukankan      html  css  js  c++  java
  • 共享内存多线程key value操作

    数据为key为uint32 value为uint32的数据。
     
    https://www.cnblogs.com/dearplain/p/11578588.html
     
    1.初始化,在共享内存上生成40个1000数组,数组每个项8个字节,4字节是key,4字节是value。
    40个数组有不同的少于1000的hash(即模,为998, 997, 991, 983, 982, 977, 976, 974, 971, 967, 964, 958, 956, 953, 947, 9
    44, 941, 937, 934, 932, 929, 926, 922, 919, 916, 914, 911, 908, 907, 904, 898, 892, 887, 886, 883, 881, 878, 877, 872, 866)。
     
    2.循环查找,从40个数组找到节点,index=key%hash,如果存在(原子读),则更新,如果不存在,增加节点后更新。
     
    3.compare and swap 支持set操作。(如果失败就重新走流程)
     
    4.atomic add支持原子增减。
     
    5.compare and swap 支持增加节点操作。(如果失败就重新走流程)
     
    6.如果40个数组都找不到,也没有空闲节点,则失败。
     
    7.收集,agent会几秒内收集所有的数据,并将key和value全部置零。根据下面的计算,可以允许在同一机器上,几秒内同时使用37000个key,能满足大部分需求。
    a = [0] * 40000
    for i in range(1, 1000000):
        done = 0
        j = 0
        for h in [998, 997, 991, 983, 982, 977, 976, 974, 971, 967, 964, 958, 956, 953, 947, 944, 941, 937, 934, 932, 929, 926, 922, 919, 916, 914, 911, 908, 907, 904, 898, 892, 887, 886, 883, 881, 878, 877, 872, 866]:
            j = j+1
            if a[i%h+(j-1)*1000] == 0:
               a[i%h+(j-1)*1000] = 1
               done = 1
               break
        if done == 0:
            print('error in:', i)
            break
  • 相关阅读:
    Laravel中如何将单个routes.php分割成多个子文件
    PHP中“==”运算符的安全问题
    一些需要禁用的PHP危险函数
    使用PHP QR Code生成二维码
    gulp详细入门教程
    h5+分享到微信、朋友圈代码示例
    学习地址
    关于this 方法中套方法中找 立即执行的问题 等问题
    判断条件问题是否存在
    jsp 基础语法
  • 原文地址:https://www.cnblogs.com/dearplain/p/11578588.html
Copyright © 2011-2022 走看看