|
发表于 2023-8-21 17:55:30
|
显示全部楼层
以下是使用互斥锁 pthread_mutex_t 编写的多线程程序,以实现对共享内存变量 mv 的互斥访问:
- #include <stdio.h>
- #include <pthread.h>
- int mv = 10;
- pthread_mutex_t mutex;
- void* increment(void* arg) {
- int i;
- for (i = 0; i < 10; ++i) {
- pthread_mutex_lock(&mutex); // 获取互斥锁
- mv += 1;
- pthread_mutex_unlock(&mutex); // 释放互斥锁
- }
- pthread_exit(NULL);
- }
- void* decrement(void* arg) {
- int i;
- for (i = 0; i < 5; ++i) {
- pthread_mutex_lock(&mutex); // 获取互斥锁
- mv -= 1;
- pthread_mutex_unlock(&mutex); // 释放互斥锁
- }
- pthread_exit(NULL);
- }
- int main() {
- pthread_t thread1, thread2;
- pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
- // 创建线程
- if (pthread_create(&thread1, NULL, increment, NULL) != 0) {
- perror("pthread_create failed");
- return 1;
- }
- if (pthread_create(&thread2, NULL, decrement, NULL) != 0) {
- perror("pthread_create failed");
- return 1;
- }
- // 等待线程执行完毕
- if (pthread_join(thread1, NULL) != 0) {
- perror("pthread_join failed");
- return 1;
- }
- if (pthread_join(thread2, NULL) != 0) {
- perror("pthread_join failed");
- return 1;
- }
- printf("mv = %d\n", mv);
- pthread_mutex_destroy(&mutex); // 销毁互斥锁
- return 0;
- }
复制代码
主函数初始化了共享内存变量 mv 的初值为10,然后创建了互斥锁 mutex。接着,创建了两个线程 thread1 和 thread2,分别调用 increment 和 decrement 函数来实现对 mv 的自加和自减操作,每个线程执行10次和5次。在每个操作之前,线程会使用 pthread_mutex_lock 函数来获取互斥锁,以确保只有一个线程可以访问临界资源 mv。每个操作完成后,线程会使用 pthread_mutex_unlock 函数释放互斥锁。
主函数等待两个线程执行完毕,并输出最终的 mv 值。最后,主函数使用 pthread_mutex_destroy 函数销毁互斥锁。
这样,通过互斥锁的机制,可以确保在任意时刻只有一个线程可以访问临界资源 mv,从而实现了对共享内存的互斥访问。
希望以上代码能满足您的需求!如有任何问题,请随时提问。
如果问题已经解决,请设置最佳答案 |
|