Python并发场景下临界区相关技术问题咨询
问题1:多线程并发从队列取元素是否会拿到相同元素?
如果你的队列是线程安全的实现(比如Python标准库的queue.Queue、Java的ConcurrentLinkedQueue这类),那完全不用担心多个线程取到相同元素的情况。这类队列的get()(或对应取出方法)本身是原子操作,内部通过锁或者无锁同步机制保证了同一时间只有一个线程能取出元素,不会出现重复取的问题。
但如果是你自己手动实现的非线程安全队列(比如用普通列表模拟,没加同步控制),那确实可能出现多个线程同时读取并取出同一个元素的情况——比如两个线程同时检查到队列非空,然后都去取同一个位置的元素。
问题2:多线程用相同变量名打开不同文件是否有问题?
完全不会有问题,也不属于临界区。
原因很简单:with open(...) as file里的file是线程局部的变量,每个线程在执行这段代码时,都会在自己的线程栈里创建独立的file变量,指向各自打开的文件对象,不同线程的file变量互不干扰,根本不会产生冲突。
临界区是指多个线程会访问共享资源(比如全局变量、同一个文件、共享内存)的代码段,但这里每个线程操作的是独立目录下的不同文件,变量也是线程私有,没有共享资源,所以不存在临界区的问题。
内容的提问来源于stack exchange,提问作者user20426821
相关产品推荐
相关产品推荐

