linux C语言 多线程竞争(加锁解锁 pthread_mutex_tpthread_mutex_lock()pthread_mutex_unlock() 可解决)
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux C语言 多线程竞争(加锁解锁 pthread_mutex_tpthread_mutex_lock()pthread_mutex_unlock() 可解决)相关的知识,希望对你有一定的参考价值。
参考文章:Linux C语言 多线程竞争实例以及简单解决办法
线程在短时间内对相同内存单元进行操作时,如果不加锁解锁,有可能产生线程竞争的情况,即最终结果不符合预期
示例:
test_pthread_compete.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
static long unsigned int count = 0;
pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
static void *funcAdd(void *arg)
pthread_mutex_lock(&mylock);
count++;
pthread_mutex_unlock(&mylock);
sleep(1);
pthread_mutex_lock(&mylock);
count++;
pthread_mutex_unlock(&mylock);
sleep(1);
pthread_mutex_lock(&mylock);
count++;
pthread_mutex_unlock(&mylock);
pthread_exit(NULL);
static void *funcAdd_nolock(void *arg)
count++;
sleep(1);
count++;
sleep(1);
count++;
pthread_exit(NULL);
int main()
pthread_t tid[1024];
int i, j;
//不加锁
for(i = 0; i < 1000; i++)
if(pthread_create(&tid[i], NULL, funcAdd_nolock, NULL) != 0)
perror("pthread_create()");
//for(j = 0; j < i; j++)
// pthread_join(tid[i], NULL);
//
for(i = 0; i < 1000; i++)
pthread_join(tid[i], NULL);
printf("if without lock, count = %ld\\n", count);
count = 0;
//加锁
for(i = 0; i < 1000; i++)
if(pthread_create(&tid[i], NULL, funcAdd, NULL) != 0)
perror("pthread_create()");
//for(j = 0; j < i; j++)
// pthread_join(tid[i], NULL);
//
for(i = 0; i < 1000; i++)
pthread_join(tid[i], NULL);
printf("if has lock, count = %ld\\n", count);
exit(0);
ubuntu上编译:
gcc test_pthread_compete.c -lpthread -o test_pthread_compete && echo && ./test_pthread_compete
运行结果:
[root@ubuntu /arnold_test/20220721_test_pthread]15# gcc test_pthread_compete.c -lpthread -o test_pthread_compete && echo && ./test_pthread_compete
if without lock, count = 2935
if has lock, count = 3000
[root@ubuntu /arnold_test/20220721_test_pthread]16# gcc test_pthread_compete.c -lpthread -o test_pthread_compete && echo && ./test_pthread_compete
if without lock, count = 2935
if has lock, count = 3000
[root@ubuntu /arnold_test/20220721_test_pthread]17# gcc test_pthread_compete.c -lpthread -o test_pthread_compete && echo && ./test_pthread_compete
if without lock, count = 2943
if has lock, count = 3000
以上是关于linux C语言 多线程竞争(加锁解锁 pthread_mutex_tpthread_mutex_lock()pthread_mutex_unlock() 可解决)的主要内容,如果未能解决你的问题,请参考以下文章
REDIS10_Redission的入门案例多主案例搭建分布式锁进行加锁解锁底层源码解析
REDIS10_Redission的入门案例多主案例搭建分布式锁进行加锁解锁底层源码解析
浅谈AQS锁实现机制(含ReentrantReadWriteLock读写锁加锁解锁相关源码分析)
python37 1.GIL--全局解释器锁 2.GIL带来的问题 3.为什么需要GIL 4.GIL的加锁解锁时机 5.关于GIL的性能的讨论 6.线程常用方法 7.GIL锁与自定义锁的区别 8.进