linux关于多进程的加锁

2025-12-28 12:16:38

没加锁前

#include

#include

#include

#include

#define THREAD_COUNT 20000

void *add_thread (void *argv)

{

// 将接收的v参数转换为int指针

int *p = argv;

// 对指向的内存int数据加1,也就是给num加1

*p = *p + 1;

return NULL;

}

int main ()

{

pthread_t threads[THREAD_COUNT];

int num; // 被n个线程进行不断累加的变量

// 启动20000个线程对num进行累加

for (int i = 0; i < THREAD_COUNT; i++)

{

pthread_create(&threads[i], NULL, add_thread, &num);

}

// 等待所有线程执行的结果

for (int i = 0; i < THREAD_COUNT; i++)

{

pthread_join(threads[i], NULL);

}

// 打印累加结果 => 会比20000要小一些

printf("累加结果:%d \n", num);

return 0;

}

加锁后

#include

#include

#include

#include

#define THREAD_COUNT 20000

// 初始化互斥锁

static pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;

void *add_thread (void *argv)

{

int *p = argv;

// 累加改变数据前加锁(此时其它线程不能进入)

pthread_mutex_lock(&counter_mutex);

*p = *p + 1;

// 累加改变数据后释放锁 (此时其它线程可以进入)

pthread_mutex_unlock(&counter_mutex);

return NULL;

}

int main ()

{

pthread_t threads[THREAD_COUNT];

int num; // 被n个线程进行不断累加的变量

// 启动20000个线程对num进行累加

for (int i = 0; i < THREAD_COUNT; i++)

{

pthread_create(&threads[i], NULL, add_thread, &num);

}

// 等待所有线程执行的结果

for (int i = 0; i < THREAD_COUNT; i++)

{

pthread_join(threads[i], NULL);

}

// 打印累加结果

printf("累加结果:%d \n", num);

// 销毁锁,释放锁占用的所有内存和资源

pthread_mutex_destroy(&counter_mutex);

return 0;

}