一种linux上的高效同步通信算法

本文介绍了一种在Linux网络编程中实现同步操作的方法。通过构建链表和数组,结合多线程调用packetProc函数来处理报文发送及响应。算法避免了内存申请和链表遍历,仅通过简单的比较和指针操作实现资源的有效管理和超时处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在linux网络编程中,经常要有网络函数的同步操作。比如,向一台服务器发送一个报文,然后等待回应返回,如果规定时间内没有回应,直接超时返回。有很多种处理办法。这里给出一种方式,只是一个思路,供大家讨论。,欢迎广大技术高手给与指点,谢谢大家!

定义:

函数名称为;packetProc(void);

算法原理:

首先建一个长度为100的链表。对应建立一个长度为100的数组。多线程调用packetProc,首先到链表头重找有没有可以利用的资源(在表头直接提取),找到了id为0的头节点,将这个节点对应的指针移到数组的第一个节点里。
开始使用hash[0],发送报文,然后等待返回。返回以后,将此数组节点中的链表节点插入到链表的尾部。完成一个操作,如果超时,也将此节点的指针返还给链表。

链表在多线程调用时会表现为长度不断的变化,极限情况下,可以为0,这时,函数直接返回失败,表示当前没有资源可用。链表的初始长度一定要与数组的长度一样,其实就是代表了每个可用的数组资源。

该算法的好处是,不会进行任何申请内存操作,不会对链表进行爬表操作。全部是简单的比较和指针操作。

算法实现:

PLISTHEAD list_head;
PLISTTAIL list_tail;
HASHNODE COMMHASH[LIST_MAX_LEN];

static pthread_mutex_t hashlist = PTHREAD_MUTEX_INITIALIZER;

int createList()
{
list_head = (PLISTHEAD)malloc(sizeof(LISTHEAD));
list_tail = (PLISTTAIL)malloc(sizeof(LISTTAIL));

PLISTNODE firnode = (PLISTNODE)malloc(sizeof(LISTNODE));
if(!firnode) return -1;

firnode->hashkey = 0;
list_head->prio =firnode;
list_tail->prio =firnode;
firnode->next = NULL;

int index = 0;
for (index = 1;index<LIST_MAX_LEN;index++)
{
PLISTNODE nextnode = (PLISTNODE)malloc(sizeof(LISTNODE));
if(!nextnode) return -1;
nextnode->hashkey = index;
list_tail->prio->next = nextnode;
list_tail->prio = nextnode;
}

pthread_mutex_init(&hashlist,NULL);

return 0x0;
}

int getHashKey()
{
if (list_head->prio->hashkey == list_tail->prio->hashkey)
return -1;
int hashkey = list_head->prio->hashkey;
COMMHASH[hashkey].prio = list_head->prio;
list_head->prio = list_head->prio->next;

return hashkey;
}

int setHashKey(int hashkey)
{
pthread_mutex_lock(&hashlist);
list_tail->prio->next = COMMHASH[hashkey].prio;
list_tail->prio = COMMHASH[hashkey].prio;
COMMHASH[hashkey].prio = NULL;
COMMHASH[hashkey].flag = NULL;
COMMHASH[hashkey].random = NULL;
memset(COMMHASH[hashkey].buffer,0x0,2048);
pthread_mutex_unlock(&hashlist);

return 0x0;
}

奥运门票系统瘫痪,再显数据库软肋 http://blog.youkuaiyun.com/netchecking/archive/2007/10/31/1858888.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值