如何在G-WAN中用C语言实现原子操作



当我使用G-WAN和C时,我想计算网页的浏览量。我对它们并不太熟悉。我使用的是英特尔64位处理器。我已经搜索了这个话题,但仍然不知道,有人能帮我吗?非常感谢。

我对G-WAN知之甚少。我一直在看他们的网站,据我所知,每个CPU运行一个线程;并且您的C代码被加载一次,然后在每次需要时在G-WAN线程的上下文中执行。在这种情况下,您应该能够使用普通的原子(例如,为C的原子操作提供合适的库,如果找不到合适的C库,则可以使用内联汇编)。

问题是将计数器存储在磁盘上(例如,这样每当服务器重新启动时,计数器就不会重置为零)。理论上,您只需要在web服务器启动时从磁盘读取一次以前的值,并在服务器停止时将新值写入磁盘一次(或者可能每30分钟写入一次,以防服务器崩溃)。它不是关键路径上的东西(例如,不是每次提供页面时都必须存储/检索的东西)。在实践中,我根本不知道G-WAN是否对此有任何支持(或者类似atexit()功能的东西是否有效)。

如果G_WAN不支持它,你可以使用(例如)由某种互斥体保护的全局"上次保存状态的时间"变量来破解它;其中(如果未设置)从磁盘加载旧状态并设置全局变量,如果设置了全局变量,则使用它来确定上次保存后是否已经过了"X分钟"。当然,获取互斥并检查全局变量的开销要比递增计数器的开销高;但它仍然比使用数据库引擎快几千倍。

当我使用G-WAN和C 时,我想计算网页的浏览量

很好,有几个选项:

  • 一个G-WAN servlet
  • G-WAN连接处理程序
  • G-WAN内容类型处理程序

。。。并且您的代码可以根据需要使用不同的方式(按速度和内存效率顺序列出):

  • 连接到G-WAN持久指针的全局原子变量
  • 连接到G-WAN持久指针的全局G-WAN KV存储
  • 系统共享内存段(它将在服务器停止后幸存)
  • 基于内存或磁盘的数据库(SQLite等)
  • DB KV存储或服务器(Memcached、Redis、mySQL等)
  • 等等

您甚至可以混合使用这些方法,并使用定期存储到磁盘的快速(内存中)方法。

这真的取决于你的需求(计数器跟踪一个页面吗?它每秒提取10000次,100万次吗?等等)

编辑:

好吧,我的错。我读这个问题太快了,对HTTP请求很着迷,忘记了servlet。我想到了一个页面上的简单点击计数器,因此我对原子变量的使用感到好奇。

请接受我的道歉。

尽管如此,我认为优化页面计数器没有什么意义,因为为页面本身提供服务可能会比读取/修改/写入单个变量消耗无限多的CPU和资源。

KV系统已经提供了锁定机制。就效率而言,使用kv_do原语应该可以处理并发访问,并在可忽略的时间内完成任务。

关于原子变量业务,我就到此为止
现在,多核体系结构对任何应用程序程序员都施加了限制,原子变量似乎是最新流行的灵丹妙药
在花了十几年左右的时间设计嵌入式多任务软件后,并发访问和任务同步一直是一个令人担忧的问题,我的结论是:它们不是。

相关内容

  • 没有找到相关文章

最新更新