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


【代码实现】

#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;
}