创建两个线程,并共享某个资源,实现运行结果的可再现性
时间: 2023-11-28 21:04:12 浏览: 28
要实现运行结果的可再现性,可以通过加锁的方式来达到。具体实现可以如下:
1. 定义一个共享资源,比如一个整型变量num,初始化为0。
2. 定义一个互斥锁mutex,用来保证同一时间只有一个线程能够访问num。
3. 创建两个线程,分别进行加和减的操作,并且在操作前后都打印一句话,以便观察线程执行的顺序。
4. 在加减操作时,先使用pthread_mutex_lock函数获取mutex锁,然后对num进行加或减的操作,最后使用pthread_mutex_unlock函数释放mutex锁。
5. 在主函数中,启动两个线程,并等待两个线程执行完毕后再退出。
以下是示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
int num = 0;
pthread_mutex_t mutex;
void* add(void* arg) {
int i;
for (i = 0; i < 10; i++) {
pthread_mutex_lock(&mutex);
num++;
printf("Thread A: add, num = %d\n", num);
pthread_mutex_unlock(&mutex);
usleep(500000);
}
pthread_exit(NULL);
}
void* sub(void* arg) {
int i;
for (i = 0; i < 10; i++) {
pthread_mutex_lock(&mutex);
num--;
printf("Thread B: sub, num = %d\n", num);
pthread_mutex_unlock(&mutex);
usleep(500000);
}
pthread_exit(NULL);
}
int main() {
pthread_t tid1, tid2;
pthread_mutex_init(&mutex, NULL);
pthread_create(&tid1, NULL, add, NULL);
pthread_create(&tid2, NULL, sub, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在上述代码中,我们定义了一个共享变量num和一个互斥锁mutex,然后在两个线程的操作中,先使用pthread_mutex_lock函数获取mutex锁,然后对num进行加或减的操作,最后使用pthread_mutex_unlock函数释放mutex锁。这样可以保证同一时间只有一个线程能够访问num,从而实现了运行结果的可再现性。
最后在主函数中,启动两个线程,并等待两个线程执行完毕后再退出,并且在退出前使用pthread_mutex_destroy函数销毁mutex锁。