我有一个网关服务器和两个客户端。(在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
是一个在主函数中发生变化的全局变量。
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秒,但仍然能够在主函数中接收数据包。
答案 0 :(得分:2)
sleep()
只挂起调用线程。因此,它不会影响主线程。
pthread_join()
来电有什么问题:
pthread_create(&tid, NULL, timer,NULL);
pthread_join(tid, NULL);
这有效地使多线程无意义。因为在主线程等待创建的线程完成之前,唯一的线程才能取得进展。
如果需要加入主线程,您需要删除pthread_join()
调用,并可能删除 while(1)
循环。或者,您可以在线程创建循环外调用pthread_exit(0)
,以便 main 完成执行,而其余的线程,如果主线程仍处于活动状态
打破循环,可以继续执行。