线程中的sleep()导致main也睡觉

时间:2016-12-23 18:09:13

标签: c multithreading timer pthreads sleep

我有一个网关服务器和两个客户端。(在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秒,但仍然能够在主函数中接收数据包。

1 个答案:

答案 0 :(得分:2)

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

pthread_join()来电有什么问题:

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

这有效地使多线程无意义。因为在主线程等待创建的线程完成之前,唯一的线程才能取得进展。

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