Pthread Mutex 挂在一个线程中

Posted

技术标签:

【中文标题】Pthread Mutex 挂在一个线程中【英文标题】:Pthread Mutex hanging in one thread 【发布时间】:2014-04-17 20:31:30 【问题描述】:

在我用 C 编写的进程中,我有以下三个线程: 1. 第一个线程处理监听和接受新的 TCP 连接。 2. 为每个新的新连接调度第二个线程,并读取视频文件并将其流式传输回客户端。 3. 第三个线程侦听来自其他应用程序(即 IPC)的 UDP 套接字上的事件。

这是我读取请求的视频文件并将其写入套接字的代码,我尝试如下锁定和解锁互斥锁,以便稍后让第三个线程能够获取互斥锁:

        /* Read till end of file is not reached. */
        while (1) /* Loop forever */
        
            len = fread(read_buf, 1, 1024, pf);
            pthread_mutex_lock(&client->mutex);

            /* Write to the socket. */
            if (write(client->fd, read_buf, len) <= 0)
                break;

            if (len < 1024)
            
                /* Reset to the begining of the file. */
                fseek(pf, 0L, SEEK_SET);
                break;
            

            client->offset = ftell(pf);
            pthread_mutex_unlock(&client->mutex);
            usleep(5);
        
        fclose(pf);
        client->state = 4;

在第三个线程中,当一个事件到达时,我尝试搜索其对应的用户,并获取互斥锁来做一些事情,但是线程在尝试获取互斥锁时卡住的问题如下,并且不执行在 pthread_mutex_lock 下方打印

int handle_event(EVENT_TYPE event, TransactionID t_id, void *data)

switch (event)

    case PREPARE_TO_EXPORT:
    
            // Searching for the client if the client is found do the below
            printf("Prepared to export.\n");
            pthread_mutex_lock(&client->mutex);
            printf("Handling Export\n");
    


可能是什么问题?

【问题讨论】:

我只是在这里猜测,但如果有多个线程并且你只睡了 5 我们可能是一些调度问题。如果您的睡眠时间超过 5 我们会怎样? 我试图增加时间,但没有任何反应。 你在哪里解锁 handle_event 中的互斥锁? 最后我没有包括那部分,但我正在解锁它 如果你最后解锁了,你确定解锁前已经被锁定了吗?解锁未被尝试解锁的线程锁定的互斥锁是未定义的行为。 【参考方案1】:

如果/当线程 2 退出循环时,它不会解锁互斥锁。

【讨论】:

当我仍在while循环中时不会出现问题,只有当我到达文件末尾时才会出现if条件。 @self。我试过了,还是不行。正如我所说,当我仍然是循环并且还没有中断时,问题就会发生。 @HA-AS 你修复了两个丢失的解锁吗? @self。是的,我都修好了,但仍然挂着 @HA-AS 到时候调试了。【参考方案2】:

我发现了问题,这是我的错误。当我收到一个新请求时,我为用户创建一个新结构并将其添加到 unordered_map,稍后我继续将该结构作为对象处理,但我必须使用已添加到无序映射的结构就位。

我认为无序映射不会将结构作为自身并将其添加到其容器中,而是创建自己的克隆。

【讨论】:

克隆,也称为副本(克隆通常保留给多态深度克隆或模板对象工厂)

以上是关于Pthread Mutex 挂在一个线程中的主要内容,如果未能解决你的问题,请参考以下文章

pthread_mutex_lock 和 pthread_mutex_lock 在另一个线程中

使用 Mutex 和 Pthread 库的错误输出

线程相关函数-pthread_mutex_lock(), pthread_mutex_unlock() 互斥锁

pthread_cond_wait 和 pthread_mutex_lock 优先级?

Linux 线程锁 pthread_mutex_t

pthread_mutex_lock()pthread_mutex_unlock()