当前位置: 技术问答>linux和unix
问一个socket send的问题
来源: 互联网 发布时间:2017-01-07
本文导语: 现在我程序里面有两个线程 threadFunc1() { .................. pthread_mutex_lock(&mutex); .......... buf[i]=12333; pthread_mutex_unlock(&mutex); } 线程1负责往BUFF里面存放数据 threadFunc2() { pthread_mutex_lock(&mutex); .......... send(socketfd,buf,len,0); pthread...
现在我程序里面有两个线程
threadFunc1()
{
..................
pthread_mutex_lock(&mutex);
..........
buf[i]=12333;
pthread_mutex_unlock(&mutex);
}
线程1负责往BUFF里面存放数据
threadFunc2()
{
pthread_mutex_lock(&mutex);
..........
send(socketfd,buf,len,0);
pthread_mutex_unlock(&mutex);
}
线程2负责把BUFF里的数据发出去
两边采用了互斥锁来保证数据安全。
现在的问题是,当网络不好时,send函数把缓存里的数据堆满后,阻塞在这里
而互斥锁没有解锁,导致整个程序停掉了
求解。
threadFunc1()
{
..................
pthread_mutex_lock(&mutex);
..........
buf[i]=12333;
pthread_mutex_unlock(&mutex);
}
线程1负责往BUFF里面存放数据
threadFunc2()
{
pthread_mutex_lock(&mutex);
..........
send(socketfd,buf,len,0);
pthread_mutex_unlock(&mutex);
}
线程2负责把BUFF里的数据发出去
两边采用了互斥锁来保证数据安全。
现在的问题是,当网络不好时,send函数把缓存里的数据堆满后,阻塞在这里
而互斥锁没有解锁,导致整个程序停掉了
求解。
|
友情帮顶
|
你不应该互斥send,而应该是把数据拷贝出来,再send:
tempbuff;
pthread_mutex_lock(&mutex);
..........
//copy to tempbuff
pthread_mutex_unlock(&mutex);
send(socketfd,tempbuf,len,0);
tempbuff;
pthread_mutex_lock(&mutex);
..........
//copy to tempbuff
pthread_mutex_unlock(&mutex);
send(socketfd,tempbuf,len,0);
|
楼主,你这种线程间通讯方式不行的,可能在某种情况下,数据写到buffer中,却没有被发出去,而是被后面的数据覆盖了。
建议:
(1)使用pipe来做线程间数据通讯
(2)申请一个大的buffer数组(全局),通过pipe传递buffer的指针,而不是直接传输数据,这样效率能高很多。
(3)每个buffer需要一个标识flag,表明这个buffer里的数据是否已经发出去。防止数据丢失
暂时就想到这些
建议:
(1)使用pipe来做线程间数据通讯
(2)申请一个大的buffer数组(全局),通过pipe传递buffer的指针,而不是直接传输数据,这样效率能高很多。
(3)每个buffer需要一个标识flag,表明这个buffer里的数据是否已经发出去。防止数据丢失
暂时就想到这些
|
学习一下条件变量,成功修改后再学习:I/O复用。