作为非常常用的数据结构,单项链表具有表头小,从头结点添加/删除速度快的优点.
常用于无限制长度的数据缓存处理。
比如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的原子访问。