gpt4 book ai didi

c - 线程中的 sleep() 导致 main 也进入休眠状态

转载 作者:太空宇宙 更新时间:2023-11-04 02:32:36 25 4
gpt4 key购买 nike

我有一个网关服务器和 2 个客户端。(在 Oracle VM VirtualBox 中制作)。

在我的网关服务器中,我让 listener.c 监听所有数据包。(在 while(1) 循环中)。

如果客户端发送有效 token ,我必须将其放入我的授权 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 秒但仍然能够在主要功能中接收数据包。

最佳答案

sleep() 只暂停调用线程。因此,它不会影响线程。

有问题的是 pthread_join() 调用:

 pthread_create(&tid, NULL, timer,NULL);
pthread_join(tid, NULL);

这有效地使多线程变得毫无意义。因为只有线程会在主线程等待创建的线程完成时取得进展。

如果主线程需要加入,您需要删除 pthread_join() 调用,并且可能在 while(1) 循环的 之外删除它。或者,您可以在线程创建循环之外调用 pthread_exit(0) 以便 main 完成执行,而其余线程(如果在主线程时仍处于事件状态)打破它的循环,可以继续执行。

关于c - 线程中的 sleep() 导致 main 也进入休眠状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com