gpt4 book ai didi

linux - 互斥体及其对执行时间(和 CPU 使用率)的影响

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:40 26 4
gpt4 key购买 nike

我编写了一个非常简单的测试程序来检查 pthread 互斥体的效率。但我无法分析得到的结果。 (我可以在 Linux 系统监视器中看到 4 个 CPU,这就是为什么我至少有 4 个事件线程,因为我想让它们全部忙碌。)代码中不需要互斥体的存在。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t lock1, lock2, lock3, lock4;

void do_sth() { /* just open a files, read it and copy to another file */
int i;
for (i = 0; i < 1; i++) {
FILE* fp = fopen("(2) Catching Fire.txt", "r");
if (fp == NULL) {
fprintf(stderr, "could not open file\n");
exit(1);
}
char filename[20];
sprintf(filename, "a%d", (int)pthread_self());
FILE* wfp = fopen(filename, "w");
if (wfp == NULL) {
fprintf(stderr, "could not open file for write\n");
exit(1);
}
int c;
while (c = fgetc(fp) != EOF) {
c++;
fputc(c, wfp);
}
close(fp);
close(wfp);
}

}
void* routine1(void* param) {
pthread_mutex_lock(&lock1);
do_sth();
pthread_mutex_unlock(&lock1);
}
void* routine2(void* param) {
pthread_mutex_lock(&lock2);
do_sth();
pthread_mutex_unlock(&lock2);
}
void* routine3(void* param) {
pthread_mutex_lock(&lock3);
do_sth();
pthread_mutex_unlock(&lock3);
}
void* routine4(void* param) {
pthread_mutex_lock(&lock4);
do_sth();
pthread_mutex_unlock(&lock4);
}

int main(int argc, char** argv) {
int i ;
pthread_mutex_init(&lock1, 0);
pthread_mutex_init(&lock2, 0);
pthread_mutex_init(&lock3, 0);
pthread_mutex_init(&lock4, 0);

pthread_t thread1[4];
pthread_t thread2[4];
pthread_t thread3[4];
pthread_t thread4[4];

for (i = 0; i < 4; i++)
pthread_create(&thread1[i], NULL, routine1, NULL);
for (i = 0; i < 4; i++)
pthread_create(&thread2[i], NULL, routine2, NULL);
for (i = 0; i < 4; i++)
pthread_create(&thread3[i], NULL, routine3, NULL);
for (i = 0; i < 4; i++)
pthread_create(&thread4[i], NULL, routine4, NULL);

for (i = 0; i < 4; i++)
pthread_join(thread1[i], NULL);
for (i = 0; i < 4; i++)
pthread_join(thread2[i], NULL);
for (i = 0; i < 4; i++)
pthread_join(thread3[i], NULL);
for (i = 0; i < 4; i++)
pthread_join(thread4[i], NULL);
printf("Hello, World!\n");
}

我以两种方式执行该程序,使用和不使用所有互斥锁。我测量执行时间(使用 time ./a.out)和平均 CPU 负载(使用 htop)。这是结果:

首先:当我使用 htop 时,我可以看到当我在代码中不使用任何互斥体时,系统的 loadavg 显着增加。我不知道为什么会发生这种情况。 (4 个事件线程还不足以充分利用 4 个 CPU 吗?)

第二:使用所有这些互斥体执行程序所需的时间比没有互斥体时要少(一点)。为什么会发生这种情况?我的意思是,应该需要一些时间来 sleep 和唤醒线程。

编辑:我想,当我使用锁时,我会让其他线程进入休眠状态,并且它消除了很多上下文切换(节省了一些时间),这可能是原因吗?

最佳答案

每个线程使用一个锁,这就是为什么当您使用所有互斥锁时,您不会看到应用程序的执行时间增加:dosth() 实际上并未受到并发执行的保护。

由于所有线程都在同一个文件上工作,因此它们都应该使用相同的锁来访问它(否则您将得到不正确的结果:所有线程都试图同时修改该文件)。

尝试仅使用一个全局锁再次运行实验。

关于linux - 互斥体及其对执行时间(和 CPU 使用率)的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31682353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com