关于网络通信多线程同步的问题?

bandaoyu 2020-07-12 12:57:17

大家帮我讨论一下这个题目:现有一网络通信模块,由三个线程组成:
1.接收线程recvThread负责从全局连接句柄handle接收数据
2.发送线程sendThread负责向全局连接句柄handle发送数据
3.断线重连线程reconnThread负责在连接故障时重新连接并刷新全局连接句柄handle

连接句柄handle支持handle.recv和handle.send,在网络异常时recv和send会立即返回-1。


线程函数伪代码如下

recvThread(){
while(true){
ret = handle.recv(&data);
if(ret == -1){
reconnet();
sleep(1);
continue;
}

dataProc(data);
}
}


sendThread(){
while(true){
data = someProc();

ret = handle.send(data);
if(ret == -1){
reconnet();
sleep(1);
continue;
}
}
}




reconnet(){
//启动独立的线程运行reconnThread
startThread(reconnThread);
}

reconnThread(){
reconnect(&handle);
}


1.请用自然语言描述上述代码有怎样的同步互斥问题。
2.请用对上述代码进行修改,解决同步互斥问题。
...全文
178 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdview 2020-07-24
  • 打赏
  • 举报
回复
线程函数伪代码如下


pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//std::mutex _mu;

recvThread(){
	while(true){

        pthread_mutex_lock(&mutex)
        //std::unique_lock<std::mutex> guard(_mu);
		ret = handle.recv(&data);
pthread_mutex_unlock(&mutex);
//guard.ulock();

		if(ret == -1){
			reconnet();
			sleep(1);
			continue;
}
		dataProc(data);
}
}


sendThread(){
	while(true){
data = someProc();
pthread_mutex_lock(&mutex)
        //std::unique_lock<std::mutex> guard(_mu);
		ret = handle.send(data);
        pthread_mutex_unlock(&mutex);
//guard.ulock();
		if(ret == -1){
			reconnet();
			sleep(1);
			continue;
}
}
}




reconnet(){
	//启动独立的线程运行reconnThread
	startThread(reconnThread);
}

reconnThread(){
  
pthread_mutex_lock(&mutex)
   //std::unique_lock<std::mutex> guard(_mu);
	reconnect(&handle);
    pthread_mutex_unlock(&mutex);
    //guard.ulock();
}


1.请用自然语言描述上述代码有怎样的同步互斥问题。
2.请用对上述代码进行修改,解决同步互斥问题。

1、连接句柄handle是全局变量,多线程共享同一个变量会引起资源争抢和冲突。

2、红色代码

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧