多线程互斥与同步
简单的写个模拟生产者消费者的多线程代码,
生产者:每次对一个全局变量加1,并唤醒消费者输出该变量的值
消费者:每次等待生产者对全局变量加1,之后输出全局变量的值
期望是消费者每次从1开始,依次打印全局变量的值。
代码如下:
可是实际的效果如下:
consumer_thread woke up, val is: 1
consumer_thread woke up, val is: 2
consumer_thread woke up, val is: 2
consumer_thread woke up, val is: 4
consumer_thread woke up, val is: 5
consumer_thread woke up, val is: 6
疑问:
1、这段代码处理线程互斥和同步的用法对吗?特别是对条件变量的用法。
2、为什么红色区域的输出会有两次的值都是2呢?
生产者:每次对一个全局变量加1,并唤醒消费者输出该变量的值
消费者:每次等待生产者对全局变量加1,之后输出全局变量的值
期望是消费者每次从1开始,依次打印全局变量的值。
代码如下:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int val;
pthread_mutex_t val_lock;
pthread_cond_t val_cond;
void *producer_thread(void *args)
{
while (1) {
pthread_mutex_lock(&val_lock);
val++;
pthread_cond_signal(&val_cond);
pthread_mutex_unlock(&val_lock);
sleep(1);
}
return NULL;
}
void *consumer_thread(void *args)
{
while (1) {
pthread_mutex_lock(&val_lock);
pthread_cond_wait(&val_cond, &val_lock);
printf("consumer_thread woke up, val is: %d\n", val);
pthread_mutex_unlock(&val_lock);
sleep(1);
}
return NULL;
}
int main(int argc, const char *argv[])
{
pthread_t producer_tid;
pthread_t consumer_tid;
pthread_mutex_init(&val_lock, NULL);
pthread_cond_init(&val_cond, NULL);
pthread_create(&producer_tid, NULL, producer_thread, NULL);
pthread_create(&consumer_tid, NULL, consumer_thread, NULL);
pthread_mutex_destroy(&val_lock);
pthread_cond_destroy(&val_cond);
pthread_join(producer_tid, NULL);
pthread_join(consumer_tid, NULL);
while (1)
sleep(1);
return 0;
}
可是实际的效果如下:
consumer_thread woke up, val is: 1
consumer_thread woke up, val is: 2
consumer_thread woke up, val is: 2
consumer_thread woke up, val is: 4
consumer_thread woke up, val is: 5
consumer_thread woke up, val is: 6
疑问:
1、这段代码处理线程互斥和同步的用法对吗?特别是对条件变量的用法。
2、为什么红色区域的输出会有两次的值都是2呢?
...全文
相关推荐
windows多线程的同步和互斥
然而,多线程环境下可能会出现数据竞争、死锁等问题,因此需要使用同步和互斥机制来保证线程安全。一、线程同步线程同步是指在多线程环境中,控制多个线程按特定顺序执行或协同工作的一种机制。
Linux下多线程编程的互斥与同步
在Linux系统中,多线程编程常常涉及到线程间的互斥与同步,这是为了确保并发执行的线程在访问共享资源时不会发生数据竞争或不一致的状态。
linux上实现多进程和多线程实现同步互斥(源代码)
同步和互斥在多进程中主要通过信号量和消息队列等机制实现。二、多线程多线程则是在一个进程中创建多个执行流,它们共享同一块内存空间,资源利用率高,但数据同步和互斥问题更复杂。
Python实现的多线程同步与互斥锁功能示例
### Python实现的多线程同步与互斥锁功能详解在多线程编程中,确保线程间的正确同步是至关重要的。
C# 多线程同步与互斥,使用Mutex和AutoResetEvent类
在C#编程中,多线程同步和互斥是并发编程中的关键概念,它们用于确保在多线程环境中数据的一致性和程序的正确性。


