- 论坛徽章:
- 11
|
回复 1# Dannysd
大神们的建议是合理的,但老板估计不愿听“这代码太垃圾,要彻底重写”。
几个建议:
1. 线程同步是必须的。这关系到程序逻辑的正确性,和架构无关。
2. 简化同步逻辑。A(收线程)做主动控制,B(发线程)做被动响应。以连接状态为例,只能由A修改,B只读。
3. 伪代码。quick & dirty的fix大概就是这样,细节上你继续完善吧。- /*
- * conn_mutable信号量初值为0,连接状态是否可修改
- * conn_ready信号量初值为0 ,连接是否就绪
- * conn_ok初值为false,推荐__atomic / __sync存取
- */
- void *thread_recv(void *arg)
- {
- while (!sys_exit) {
- sem_wait(&conn_mutable);
- reconnect(); /* 如果fd已打开,先关闭 */
- conn_ok = true;
- sem_post(&conn_ready);
- while (1) {
- ret = recv(fd, …);
- if (ret > 0) {
- /* 正常接收 */
- } else if (ret == 0 ) {
- /* 正常关闭 */
- } else {
- if (errno == EINTR || errno == EAGAIN) continue;
- conn_ok = false;
- break;
- }
- }
- }
- return NULL;
- }
- void *thread_send(void* arg)
- {
- while (!sys_exit) {
- sem_post(&conn_mutable);
- sem_wait(&conn_ready);
- while (conn_ok) {
- ret = send(fd, ...);
- if (ret > 0) {
- /* 正常发送 */
- } else {
- if (errno == EINTR || errno == EAGAIN) continue;
- break;
- }
- }
- }
- return NULL;
- }
复制代码 |
|