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