线程中的 sleep() 也会导致 main 睡眠
Posted
技术标签:
【中文标题】线程中的 sleep() 也会导致 main 睡眠【英文标题】:sleep() in thread causes main to sleep too 【发布时间】:2017-05-09 10:17:49 【问题描述】:我有一个网关服务器和 2 个客户端。(在 Oracle VM VirtualBox 中制作)。
在我的网关服务器中,我有 listener.c 监听所有数据包。(在 while(1)
循环中)。
如果客户端发送了一个有效的令牌,我必须把它放在我的授权 MAC 列表中,并且所有来自授权 MAC 的数据包都必须转发 180 秒。 (换句话说,给定 180 秒的互联网访问时间)。
在 180 秒之前,单个用户的东西正在运行。
/* authorized MACs list */
char *auth_macs[5];
int client;
pthread_mutex_t lock;
/* after 3 min remove the client from auth list */
void *timer(void *arg)
sleep(180);
pthread_mutex_lock(&lock);
auth_macs[client] = " ";
client--;
pthread_mutex_unlock(&lock);
return NULL;
这就是我尝试实现计时器线程的方式。 client
是一个全局变量,在 main 函数中会发生变化。
if(has_token == 1)
client++;
sprintf(client_ip, "./accept.sh %s", sender);
system(client_ip);
auth_macs[client] = client_mac;
/* start timer thread */
pthread_t tid;
pthread_create(&tid, NULL, timer,NULL);
pthread_join(tid, NULL);
这是我开始这个线程的地方。 accept.sh
是一个允许转发的 shell 脚本。
我的问题是我认为计时器线程中的sleep(180)
只会自行停止。但相反,listener.c
停止接收数据包。
我该如何解决这个问题?我希望计时器等待 180 秒,但仍然能够在主函数中接收数据包。
【问题讨论】:
pthread_join
将等待线程终止。不管它睡多久。
【参考方案1】:
sleep()
只挂起调用线程。所以,它不会影响 main 线程。
有问题的是pthread_join()
调用:
pthread_create(&tid, NULL, timer,NULL);
pthread_join(tid, NULL);
这有效地使多线程变得毫无意义。因为只有主线程会一直在等待,直到创建的线程完成。
如果主线程需要加入,您需要删除pthread_join()
调用,并且可能在while(1)
循环之外。或者,您可以在线程创建循环之外调用pthread_exit(0)
,以便 main 在其余线程时完成执行,如果在主线程时仍然存在的话
打破它的循环,可以继续执行。
【讨论】:
或者他可以使用守护线程而不是普通线程,这样他就不需要加入它。 @JohnBollinger 该技术的问题在于,当主线程退出时,它可能会释放守护线程仍在使用的资源,从而导致守护线程中出现未定义的行为。最好有一个有序的关机顺序。以上是关于线程中的 sleep() 也会导致 main 睡眠的主要内容,如果未能解决你的问题,请参考以下文章