线程中的 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 睡眠的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Main 函数上的 Sleep() 会停止所有线程?

sleep()函数怎么具体在c语言中怎么用?

python time.sleep()-睡眠线程还是进程?

睡眠方法和多线程的产量方法有什么区别?

09_控制线程_线程睡眠sleep

新线程导致问题 C++