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.进

ORACLE用户的加锁解锁

Linux 进程与线程四(加锁--解锁)