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

在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.csdn.net/netchecking/archive/2007/10/31/1858888.aspx

你可能感兴趣的:(多线程,编程,算法,linux,.net)