C语言中当一个函数首先创建1号线程,然后创建2号线程和3号线程,三者都计划访问全局变量时,如何通过同步机制确保1号线程优先访问,2号线程在后,最后才到3号线程访问
时间: 2024-11-03 16:16:09 浏览: 21
在C语言中,为了确保线程按照顺序访问共享全局变量并避免数据竞争,可以使用互斥锁(mutex)或者信号量(semaphore)作为同步机制。这里是一个简单的示例:
1. 使用`pthread_mutex_t`创建互斥锁:
```c
#include <pthread.h>
pthread_mutex_t global_lock; // 初始化为未锁定
int global_var;
void* thread_func(void* arg) {
pthread_mutex_lock(&global_lock); // 线程获取锁前会阻塞
// 访问全局变量
printf("Thread %d is accessing global_var\n", *(int*)arg);
// ... 其他操作
pthread_mutex_unlock(&global_lock); // 访问完毕释放锁
return NULL;
}
int main() {
pthread_t threads[3];
int thread_id[3] = {1, 2, 3};
for (int i = 0; i < 3; ++i) {
pthread_create(&threads[i], NULL, thread_func, &thread_id[i]);
// 确保第一个线程先获取锁
if (i != 0) {
pthread_mutex_lock(&global_lock);
}
}
// 主线程等待所有子线程结束
for (int i = 0; i < 3; ++i) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&global_lock); // 锁销毁后不再需要
return 0;
}
```
在这个例子中,主线程先对全局锁上锁,然后依次创建每个线程,它们在尝试访问全局变量之前都会等待锁被解锁。这样就保证了1号线程优先,接着是2号线程,最后是3号线程。
阅读全文