实现线程的同步与互斥代码
时间: 2023-12-11 20:05:46 浏览: 61
可以使用信号量和互斥锁来实现线程的同步与互斥。
信号量可以用来控制线程的并发数量,通过对信号量进行操作,可以实现线程的同步。互斥锁可以用来对共享资源进行加锁和解锁,以保证同一时间只有一个线程可以访问该资源,从而实现线程的互斥。
下面是一个使用信号量和互斥锁实现线程同步和互斥的示例代码:
```
#include <pthread.h>
#include <semaphore.h>
#define THREAD_NUM 10 // 线程数
#define LOOP_NUM 10 // 每个线程循环次数
int g_count = 0; // 共享资源
sem_t g_sem; // 信号量
pthread_mutex_t g_mutex; // 互斥锁
void* thread_func(void* arg)
{
int i;
for (i = 0; i < LOOP_NUM; i++) {
sem_wait(&g_sem); // 等待信号量
pthread_mutex_lock(&g_mutex); // 加锁
g_count++;
pthread_mutex_unlock(&g_mutex); // 解锁
sem_post(&g_sem); // 发送信号量
}
return NULL;
}
int main()
{
pthread_t threads[THREAD_NUM];
int i;
sem_init(&g_sem, 0, THREAD_NUM); // 初始化信号量
pthread_mutex_init(&g_mutex, NULL); // 初始化互斥锁
for (i = 0; i < THREAD_NUM; i++) {
pthread_create(&threads[i], NULL, thread_func, NULL); // 创建线程
}
for (i = 0; i < THREAD_NUM; i++) {
pthread_join(threads[i], NULL); // 等待线程结束
}
sem_destroy(&g_sem); // 销毁信号量
pthread_mutex_destroy(&g_mutex); // 销毁互斥锁
printf("g_count = %d\n", g_count); // 打印共享资源的值
return 0;
}
```
在上面的代码中,我们使用了一个信号量和一个互斥锁来控制线程的并发数量和对共享资源的访问。在线程函数中,我们先等待信号量,然后加锁,对共享资源进行操作,解锁,最后发送信号量。在主函数中,我们创建多个线程,等待线程结束,然后打印共享资源的值。
需要注意的是,在使用互斥锁时,要确保加锁和解锁的代码段是原子操作,否则可能会出现死锁或竞态条件等问题。
阅读全文