互斥量操作原语

保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么 在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。临界区的选定因尽可能小,如果选定太大会影响程序的并行处理性能。


【代码实现】

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

long long idx = 0;
pthread_mutex_t mutex;

void* threadfunc(void* arg)
{
	int local;
	for (int i = 0; i < 5000; i++){
		// 加锁(临界区)关键代码段
		pthread_mutex_lock(&mutex);
		local = idx;
		printf("%d, thread id = %d\n", local + 1, (unsigned int)pthread_self());
		idx = local + 1;
		// 解锁
		pthread_mutex_unlock(&mutex);
	}
	return (void*)0;
}

int main(int argc, char* argv[])
{
	// 初始化锁
	pthread_mutex_init(&mutex, NULL);
	pthread_t tid[2];
	pthread_create(&tid[0], NULL, threadfunc, (void*)5);
	pthread_create(&tid[1], NULL, threadfunc, (void*)5);

	pthread_join(tid[0], NULL);
	pthread_join(tid[1], NULL);
	// 销毁锁	
	pthread_mutex_destroy(&mutex);

	return 0;
}

 

 

评论