Linux如何实现进程间同步
在Linux系统中,进程间同步是一种常见的需求,它可以确保多个进程按照预期的顺序执行,避免数据竞争和死锁等问题,本文将介绍Linux中几种常见的进程间同步机制,包括信号量、互斥锁、条件变量和读写锁。
信号量
信号量(semaphore)是一种计数器,用于管理对共享资源的访问,它有两个主要操作:P操作(等待)和V操作(释放),当一个进程需要获取资源时,它会执行P操作,如果信号量的值大于0,那么信号量的值减1,进程继续执行;否则,进程阻塞,直到信号量的值变为正数,当一个进程完成对资源的使用后,它会执行V操作,将信号量的值加1。
要使用信号量,首先需要创建一个信号量对象,在C语言中,可以使用sem_init()
函数初始化一个信号量,然后使用sem_wait()
和sem_post()
函数进行P操作和V操作,以下是一个简单的示例:
include <stdio.h> include <pthread.h> include <semaphore.h> sem_t sem; void *func(void *arg) { sem_wait(&sem); printf("线程%d获取到资源 ", (int)arg); sleep(1); printf("线程%d释放资源 ", (int)arg); sem_post(&sem); return NULL; } int main() { pthread_t thread1, thread2; sem_init(&sem, 0, 1); pthread_create(&thread1, NULL, func, (void *)1); pthread_create(&thread2, NULL, func, (void *)2); pthread_join(thread1, NULL); pthread_join(thread2, NULL); sem_destroy(&sem); return 0; }
互斥锁
互斥锁(mutex)是一种更细粒度的同步机制,它可以保护一段代码或数据区域不被多个进程同时访问,当一个进程需要访问共享资源时,它会尝试获取互斥锁,如果互斥锁已被其他进程锁定,那么当前进程会被阻塞,直到互斥锁被释放,一旦互斥锁被释放,当前进程就可以获取锁并访问共享资源,当进程完成对共享资源的使用后,它应该释放互斥锁,以便其他进程可以获取锁。
要使用互斥锁,首先需要定义一个互斥锁变量,在C语言中,可以使用pthread_mutex_t
类型的变量作为互斥锁,然后使用pthread_mutex_init()
函数初始化互斥锁,使用pthread_mutex_lock()
和pthread_mutex_unlock()
函数进行加锁和解锁操作,以下是一个简单的示例:
include <stdio.h> include <pthread.h> include <time.h> pthread_mutex_t lock; int data = 0; void *func(void *arg) { int id = (int)arg; for (int i = 0; i < 100000; i++) { pthread_mutex_lock(&lock); data++; printf("线程%d修改了data的值为%d ", id, data); pthread_mutex_unlock(&lock); } return NULL; } int main() { pthread_t thread1, thread2; pthread_mutex_init(&lock, NULL); pthread_create(&thread1, NULL, func, (void *)1); pthread_create(&thread2, NULL, func, (void *)2); pthread_join(thread1, NULL); pthread_join(thread2, NULL); pthread_mutex_destroy(&lock); return 0; }
条件变量
条件变量(condition variable)是一种更高级的同步机制,它可以让一个进程在特定条件下唤醒另一个进程,条件变量通常与互斥锁一起使用,以防止死锁,当一个进程需要等待某个条件满足时,它会执行pthread_cond_wait()
函数,该函数会自动释放互斥锁并使当前进程进入阻塞状态,当条件满足时,另一个进程可以执行pthread_cond_signal()
或pthread_cond_broadcast()
函数来唤醒等待的进程,被唤醒的进程会重新获取互斥锁并继续执行,当进程完成对共享资源的使用后,它应该调用pthread_cond_destroy()
函数销毁条件变量,以下是一个简单的示例:
include <stdio.h> include <pthread.h> include <unistd.h> include <time.h> pthread_cond_t cond; int data = 0; bool ready = false; void *func(void *arg) { int id = (int)arg; while (!ready) { pthread_cond_wait(&cond, &mutex); // 注意这里传入的是互斥锁指针而不是条件变量本身的指针!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/126199.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复