线程安全的高效单向链表

本文介绍了单向链表作为一种常用数据结构在无限制长度数据缓存处理中的应用,特别是在多线程环境下的使用。通过示例展示了如何在Windows环境下使用特定API实现线程安全的SList操作,以降低锁竞争带来的CPU消耗,提高效率。
摘要由CSDN通过智能技术生成

作为非常常用的数据结构,单项链表具有表头小,从头结点添加/删除速度快的优点.

常用于无限制长度的数据缓存处理。

比如iocp工作线程缓存输入数据,逻辑线程取缓冲数据做处理后发送到输出缓冲。这里的输入缓冲和输出缓冲就可以用单链表实现。

struct SList{

SList *next;

};

 

SListPush(SList* head,Slist* p){

p=head->next;

head->next=p;

}

SListPop(SList* head){

SList* r=p=head;

head=head->next;

return r;

}

 

在多线程情况下,因为每次对表头的操作不是原子操作,对表头的操作需要锁定。

简单做法是用CriticalSection/mutex来锁定一个表,其他表操作会等待。 考虑到slist都是短时间占用,访问次数可能很频繁。实际cpu消耗在enter/leave上面会较大。

 

更快的做法是使读写逻辑变为一个原子操作。类似 __asm lock cmpexchg这样的实现。

原子操作会有地址对齐方面的限制,32/64位都不一样,需要各种检查,自己实现起来比较繁琐。

幸运的是winxp/2003之后的版本,ms提供了这么几个api操作来实现slist的原子访问。

 

Initi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值