日期:2014-05-16  浏览次数:20641 次

问一个socket 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);

------解决方案--------------------
楼主,你这种线程间通讯方式不行的,可能在某种情况下,数据写到buffer中,却没有被发出去,而是被后面的数据覆盖了。
建议:
(1)使用pipe来做线程间数据通讯
(2)申请一个大的buffer数组(全局),通过pipe传递buffer的指针,而不是直接传输数据,这样效率能高很多。
(3)每个buffer需要一个标识flag,表明这个buffer里的数据是否已经发出去。防止数据丢失

暂时就想到这些
------解决方案--------------------
学习一下条件变量,成功修改后再学习:I/O复用。