在C语言中,进程同步是指多个进程之间协调运行的过程,当多个进程共享资源时,可能会出现竞争条件,导致数据不一致或其他问题,为了解决这个问题,我们需要使用同步机制来确保进程之间的正确执行顺序,本文将详细介绍C语言中的进程同步技术。
1、互斥锁(Mutex)
互斥锁是一种最基本的同步机制,它只允许一个进程在同一时间访问共享资源,当一个进程获得互斥锁时,其他进程必须等待,直到锁被释放,在C语言中,我们可以使用POSIX线程库(pthread)提供的互斥锁函数来实现这一功能。
以下是一个简单的互斥锁示例:
#include <stdio.h> #include <pthread.h> int counter = 0; // 共享资源 pthread_mutex_t mutex; // 互斥锁 void *increment(void *arg) { for (int i = 0; i < 100000; i++) { pthread_mutex_lock(&mutex); // 加锁 counter++; pthread_mutex_unlock(&mutex); // 解锁 } return NULL; } int main() { pthread_t tid1, tid2; pthread_mutex_init(&mutex, NULL); // 初始化互斥锁 pthread_create(&tid1, NULL, increment, NULL); pthread_create(&tid2, NULL, increment, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); printf("Counter: %d ", counter); // 输出结果应为200000 pthread_mutex_destroy(&mutex); // 销毁互斥锁 return 0; }
2、条件变量(Condition Variable)
条件变量是一种更高级的同步机制,它允许一个或多个进程等待某个条件成立,然后才继续执行,当条件不成立时,进程会被阻塞,直到另一个进程通知条件已满足,在C语言中,我们可以使用POSIX线程库(pthread)提供的条件变量函数来实现这一功能。
以下是一个简单的条件变量示例:
#include <stdio.h> #include <pthread.h> int counter = 0; // 共享资源 pthread_mutex_t mutex; // 互斥锁 pthread_cond_t cond; // 条件变量 int ready = 0; // 表示计数器是否准备好的标志 void *producer(void *arg) { for (int i = 0; i < 100000; i++) { pthread_mutex_lock(&mutex); // 加锁 counter++; pthread_mutex_unlock(&mutex); // 解锁 pthread_cond_signal(&cond); // 通知消费者计数器已增加 } return NULL; } void *consumer(void *arg) { for (int i = 0; i < 100000; i++) { pthread_mutex_lock(&mutex); // 加锁 while (counter == 0) { // 如果计数器为0,等待条件满足 pthread_cond_wait(&cond, &mutex); // 等待生产者通知 } ready = 1; // 表示计数器已准备好的标志设置为1 printf("Counter: %d ", counter); // 输出结果应为递增的整数序列 ready = 0; // 重置标志位,以便下次循环继续等待计数器增加 pthread_mutex_unlock(&mutex); // 解锁 } return NULL; } int main() { pthread_t tid1, tid2; pthread_mutex_init(&mutex, NULL); // 初始化互斥锁和条件变量 pthread_cond_init(&cond, NULL); // 初始化条件变量 pthread_create(&tid1, NULL, producer, NULL); pthread_create(&tid2, NULL, consumer, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); pthread_mutex_destroy(&mutex); // 销毁互斥锁和条件变量 return 0; }
3、信号量(Semaphore)
信号量是一种用于控制多个进程对共享资源的访问的同步机制,它有一个整数值作为参数,表示可用的资源数量,当一个进程需要访问共享资源时,它会尝试获取信号量,如果信号量的值大于0,进程将获得信号量并继续执行;否则,进程将被阻塞,直到信号量的值大于0,在C语言中,我们可以使用POSIX线程库(pthread)提供的信号量函数来实现这一功能。
以下是一个简单的信号量示例:
#include <stdio.h> #include <pthread.h> #include <semaphore.h> // 引入信号量头文件 #include <unistd.h> // 引入sleep函数头文件,用于模拟生产者和消费者之间的延迟时间差 #include <sys/time.h> // 引入时间戳函数头文件,用于计算延迟时间差的最大值和最小值 #include <math.h> // 引入数学函数头文件,用于计算平均值和标准差等统计信息 #include <stdlib.h> // 引入随机数生成函数头文件,用于生成随机的延迟时间差值和计数器值范围等参数值
原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/381485.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复