You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

线程并发控制异常:线程10无法按预期结束的问题求助

问题描述

我编写的线程函数目标是控制最多5个线程同时运行,且线程10仅能在恰好有5个线程(含自身)处于运行状态时结束。该函数在多数场景下运行正常,但当线程10成为最后一个执行的线程时会出现异常。

原代码如下:

void *thread_function2(void *arg)
{
    THREAD *thread = (THREAD*)arg;
    pthread_mutex_lock(thread->lock);
    while(active_threads >= 5)
    {
        pthread_cond_wait(thread->cond, thread->lock);  
    }

    active_threads++;    // 表示新增一个活跃线程
    pthread_mutex_unlock(thread->lock);

    info(BEGIN, thread->procId, thread->threadId);    
    if(thread->threadId == 10)
    {
        pthread_mutex_lock(thread->lock);
        while(active_threads != 5 && remaining > 1)    // 之前加了remaining>1,否则会超时
            pthread_cond_wait(thread->cond, thread->lock);  
        pthread_mutex_unlock(thread->lock);    
    } 
    
    pthread_mutex_lock(thread->lock);                
    info(END, thread->procId, thread->threadId);
    active_threads--;
    remaining--;

    if(active_threads < 5)                         
    {
        pthread_cond_broadcast(thread->cond);
    }
    pthread_mutex_unlock(thread->lock);
   
    
    return NULL;
}

测试报错信息:

检查线程...结束线程T4.10时,以下线程正在运行:10

问题分析与修复

问题根源

  1. 线程10的等待条件错误:原代码中while(active_threads !=5 && remaining>1)的逻辑矛盾——当线程10是最后一个未结束的线程时,remaining会变为1,此时条件不成立,线程10会直接跳过等待,提前结束,违反了必须在5个活跃线程状态下结束的要求。
  2. 结束操作的时机逻辑漏洞:线程10的结束操作(info(END)、修改active_threads和remaining)没有和等待条件强绑定,无论是否满足要求都会执行,导致状态异常。

修复后的代码

void *thread_function2(void *arg)
{
    THREAD *thread = (THREAD*)arg;
    pthread_mutex_lock(thread->lock);
    // 等待活跃线程数小于5,再启动当前线程
    while(active_threads >= 5)
    {
        pthread_cond_wait(thread->cond, thread->lock);  
    }

    active_threads++;
    pthread_mutex_unlock(thread->lock);

    info(BEGIN, thread->procId, thread->threadId);    

    // 线程10专属逻辑:必须等到活跃线程数恰好为5时才能结束
    if(thread->threadId == 10)
    {
        pthread_mutex_lock(thread->lock);
        // 只判断活跃线程数,移除错误的remaining条件
        while(active_threads != 5)
        {
            pthread_cond_wait(thread->cond, thread->lock);  
        }
        pthread_mutex_unlock(thread->lock);    
    } 

    // 进入结束流程,确保线程10已经满足条件
    pthread_mutex_lock(thread->lock);                
    info(END, thread->procId, thread->threadId);
    active_threads--;
    remaining--;

    // 活跃线程数不足5时,唤醒等待的线程
    if(active_threads < 5)                         
    {
        pthread_cond_broadcast(thread->cond);
    }
    pthread_mutex_unlock(thread->lock);
   
    return NULL;
}

关键修改说明

  • 移除错误的remaining>1条件:线程10的等待逻辑只需要关注当前活跃线程数是否为5,和剩余未结束的线程总数无关。
  • 强化等待逻辑的严谨性:线程10运行时会一直等待,直到活跃线程数回到5,满足要求后才会执行后续的结束操作。
  • 保留核心线程控制逻辑:其他线程的启动、活跃数控制、唤醒逻辑保持不变,确保最多5个线程同时运行的核心功能正常。

内容的提问来源于stack exchange,提问作者AndreiHirlav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:13:20