【发布时间】: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将等待线程终止。不管它睡多久。
标签: c multithreading timer pthreads sleep