linux程序多线程互斥锁的简单使用

本文介绍了Linux下程序使用多线程互斥锁的原理与实践。通过创建和初始化互斥锁,实现对临界区资源的访问控制,确保线程安全。示例中对比了使用和不使用互斥锁时的线程行为差异,强调了互斥锁在多线程同步中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

首先定义一个互斥锁变量;然后初始化该互斥锁pthread_mutex_init;

使用临界区资源的时候首先获取该锁pthread_mutex_lock(如果无法获取资源则线程会阻塞,直到该资源可以使用),对临界区资源使用完时候释放该互斥锁pthread_mutex_unlock;

       #include <pthread.h>
       pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
       pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
       pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;


       int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
       int pthread_mutex_lock(pthread_mutex_t *mutex);
       int pthread_mutex_trylock(pthread_mutex_t *mutex);
       int pthread_mutex_unlock(pthread_mutex_t *mutex);
       int pthread_mutex_destroy(pthread_mutex_t *mutex);

实例1:不使用互斥锁,多个线程输出,此时的效果是多个线程是并行输出的,没有对资源的访问进行控制

/*************************************************************************
    > File Name: threadbase.c
    > Author: 
    > Mail:  
    > Created Time: 2015骞?2鏈?4鏃?鏄熸湡浜?17鏃?4鍒?8绉?
 ************************************************************************/

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#include <pthread.h>

typedef struct Threadinfo{
	char name[64];
	int age;
	int numId;
}ThreadInfo;

int nNum, nLoop;
/*
       #include <pthread.h>

       pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;

       pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;

       pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;

       int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);

       int pthread_mutex_lock(pthread_mutex_t *mutex);

       int pthread_mutex_trylock(pthread_mutex_t *mutex);

       int pthread_mutex_unlock(pthread_mutex_t *mutex);

       int pthread_mutex_destroy(pthread_mutex_t *mutex);
*/


pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int g_num = 999;

 
void *thread_routine(void *arg)
{
	int i = 0;
//	pthread_detach(pthread_self());
	ThreadInfo * p = (ThreadInfo *)arg;
//	pthread_mutex_lock(&mutex);
	for (i = 0; i < nLoop; ++i){
		printf("thread id is :%ld, i = %d, numid is %d, g_num is %d\n", pthread_self(), i, p->numId, g_num);
		sleep(1);
	}
	printf("child exit: %ld\n", pthread_self());
//	pthread_mutex_unlock(&mutex);
	pthread_exit(arg);
}

int main()
{
	int i = 0;
	pthread_t tidArray[200];
	ThreadInfo tmp;

	printf("input the number of thread:");
	scanf("%d", &nNum);
	printf("input the number of nLoop:");
	scanf("%d", &nLoop);

	for (i = 0; i < nNum; ++i){
		memset(&tmp, 0, sizeof(ThreadInfo));
		tmp.numId= 100;
		pthread_create(&tidArray[i], NULL, thread_routine, &tmp);
	}

	for (i = 0; i < nNum; ++i){
		pthread_join(tidArray[i], NULL);
	}
	printf("parent exit\n");
	exit(0);
}



实例2:对多个线程进行控制,用互斥锁对资源的访问进行控制,每次只能有一个线程访问该资源;

/*************************************************************************
    > File Name: threadbase.c
    > Author: 
    > Mail:  
    > Created Time: 2015骞?2鏈?4鏃?鏄熸湡浜?17鏃?4鍒?8绉?
 ************************************************************************/

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#include <pthread.h>

typedef struct Threadinfo{
	char name[64];
	int age;
	int numId;
}ThreadInfo;

int nNum, nLoop;
/*
       #include <pthread.h>

       pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;

       pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;

       pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;

       int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);

       int pthread_mutex_lock(pthread_mutex_t *mutex);

       int pthread_mutex_trylock(pthread_mutex_t *mutex);

       int pthread_mutex_unlock(pthread_mutex_t *mutex);

       int pthread_mutex_destroy(pthread_mutex_t *mutex);
*/


pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int g_num = 999;

 
void *thread_routine(void *arg)
{
	int i = 0;
//	pthread_detach(pthread_self());
	ThreadInfo * p = (ThreadInfo *)arg;
	pthread_mutex_lock(&mutex);
	for (i = 0; i < nLoop; ++i){
		printf("thread id is :%ld, i = %d, numid is %d, g_num is %d\n", pthread_self(), i, p->numId, g_num);
		sleep(1);
	}
	printf("child exit: %ld\n", pthread_self());
	pthread_mutex_unlock(&mutex);
	pthread_exit(arg);
}

int main()
{
	int i = 0;
	pthread_t tidArray[200];
	ThreadInfo tmp;

	printf("input the number of thread:");
	scanf("%d", &nNum);
	printf("input the number of nLoop:");
	scanf("%d", &nLoop);

	for (i = 0; i < nNum; ++i){
		memset(&tmp, 0, sizeof(ThreadInfo));
		tmp.numId= 100;
		pthread_create(&tidArray[i], NULL, thread_routine, &tmp);
	}

	for (i = 0; i < nNum; ++i){
		pthread_join(tidArray[i], NULL);
	}
	printf("parent exit\n");
	exit(0);
}



此例中的互斥锁是静态初始化的,也可以使用函数pthread_mutex_init(&mutex, NULL)来进行初始化;

不过通过实例测试,即使不初始化也是可以的,只不过是没有自定义的属性;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值