编写两个线程,一个线程向数组中写入数据,另一个线程从该数组中读取数据。练习如何实现线程的同步。
时间: 2023-12-29 20:17:42 浏览: 89
好的,这是一个典型的生产者-消费者问题,可以使用线程间通信和同步技术来解决。下面是一个简单的实现代码:
```python
import threading
import time
# 定义一个共享数据的数组
data = []
# 定义一个互斥锁,用于保证线程同步
mutex = threading.Lock()
# 定义一个生产者线程类
class Producer(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
global data
while True:
# 获取互斥锁,保证线程同步
mutex.acquire()
# 生产者向数组中写入数据
data.append(1)
print("{} 生产者向数组中写入了一个数据,当前数组大小为{}".format(self.name, len(data)))
# 释放互斥锁
mutex.release()
# 等待一段时间
time.sleep(0.5)
# 定义一个消费者线程类
class Consumer(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
global data
while True:
# 获取互斥锁,保证线程同步
mutex.acquire()
# 判断数组是否为空
if len(data) == 0:
print("{} 消费者发现数组为空,等待生产者生产数据".format(self.name))
else:
# 消费者从数组中读取数据
data.pop()
print("{} 消费者从数组中读取了一个数据,当前数组大小为{}".format(self.name, len(data)))
# 释放互斥锁
mutex.release()
# 等待一段时间
time.sleep(1)
if __name__ == '__main__':
# 创建一个生产者线程和一个消费者线程
p = Producer("生产者")
c = Consumer("消费者")
# 启动线程
p.start()
c.start()
# 等待线程结束
p.join()
c.join()
```
在上面的代码中,我们定义了一个共享数据的数组 `data` 和一个互斥锁 `mutex`。生产者线程向数组中写入数据,消费者线程从数组中读取数据,并且通过互斥锁保证线程同步。在生产者线程中,首先获取互斥锁,然后向数组中写入数据,最后释放互斥锁。在消费者线程中,首先获取互斥锁,然后判断数组是否为空,如果为空,则输出提示信息,等待生产者生产数据;否则,从数组中读取数据,最后释放互斥锁。通过这种方式,我们实现了线程的同步,并且避免了生产者和消费者之间的竞争和冲突。
阅读全文