c - 为什么我的简单计数程序需要更长的时间才能运行多个线程?(在 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;
}
解决方案
这就是你的线程所做的:
- 读取 的值
i
。 - 增加我们读取的值。
- 写回 的增量值
i
。 - 转到步骤 1。
显然,另一个线程在完成步骤 1 之后但在完成步骤 3 之前无法读取 的值i
。因此执行步骤 1、2 或 3 的两个线程之间不能有重叠。
因此,您所有的线程都在争夺对同一资源的访问权—— i
(或保护它的互斥锁)。如果没有对其中一个或两个的独占访问权,任何线程都无法取得有用的前进进展。鉴于此,使用多个线程没有任何好处,因为一次只有一个线程可以完成有用的工作。
推荐阅读
- javascript - 如何将时间设置为始终:00:00:00?
- python-3.x - 是否可以将句子拆分为字符串列表并将同一行中的字符串列表大写?
- flutter - 为 Flutter 开发人员制作 UI 的最快方法?
- javascript - nodejs url.resolve 函数有什么替代品吗?
- javascript - 将 JS 翻译成数学(定义了多个变量)
- javascript - Discord.js 什么都不做
- pandas - 对 DataFrame 中的条目进行分组和计数
- unix - 如果 Unix 进程关闭,它会自行启动
- python - Python tkinter 无法画线
- reactjs - 我应该在 React 中为静态/不可变数据使用状态吗?