首页 > 解决方案 > 为什么我的简单计数程序需要更长的时间才能运行多个线程?(在 C 中)

问题描述

这是我的代码:

#define COUNT_TO 100000000
#define MAX_CORES 4

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
long long i = 0;

void* start_counting(void *arg){
    for(;;){

        pthread_mutex_lock(&mutex);

        if(i >= COUNT_TO){
            pthread_mutex_unlock(&mutex);
            return NULL;
        }
        i++;
        pthread_mutex_unlock(&mutex);
        //printf("i = %lld\n", i);
    }
}

int main(int argc, char* argv[]){
    int i = 0;

    pthread_t * thread_group = malloc(sizeof(pthread_t) * MAX_CORES);

    for(i = 0; i < MAX_CORES; i++){
        pthread_create(&thread_group[i], NULL, start_counting, NULL);
    }

    for(i = 0; i < MAX_CORES; i++){
        pthread_join(thread_group[i], NULL);
    }

    return 0;
}

标签: cmultithreadingconcurrencyruntime

解决方案


这就是你的线程所做的:

  1. 读取 的值i
  2. 增加我们读取的值。
  3. 写回 的增量值i
  4. 转到步骤 1。

显然,另一个线程在完成步骤 1 之后但在完成步骤 3 之前无法读取 的值i。因此执行步骤 1、2 或 3 的两个线程之间不能有重叠。

因此,您所有的线程都在争夺对同一资源的访问权—— i(或保护它的互斥锁)。如果没有对其中一个或两个的独占访问权,任何线程都无法取得有用的前进进展。鉴于此,使用多个线程没有任何好处,因为一次只有一个线程可以完成有用的工作。


推荐阅读