Boostpython生产者消费者问题(执行boostpython线程,std::mutex死锁)

Boost python producer consumer problem (execute boost python thread, std::mutex deadlock)

我正在尝试创建 boost python 模块并测试生产者和消费者问题。

但是我遇到了一些错误和问题...

下图显示了我的目标架构。

我实现了 boost python 模块

这里是 python 代码片段 (main.py)

import threading
import datetime

import PyDataTest

queue = None


def thread_function():
    print('[thread_function] start...')
    while True:
        print('[thread_function] try Pop')
        data = queue.Pop()

        print(f'[thread_function] Pop: {data}')


def wait_thread_function():
    print('[wait_thread_function] start...')

    wait_thread = threading.Thread(target=thread_function)
    wait_thread.start()

    wait_thread.join()


def gen_thread_function():
    gen_thread_obj = PyDataTest.CustomThread()

    gen_thread = threading.Thread(target=gen_thread_obj.Execute)
    gen_thread.start()
    gen_thread.join()


if __name__ == '__main__':
    print('main start')
    queue = PyDataTest.GetQueueInstance()

    wait_thread_func = threading.Thread(target=wait_thread_function, args=())
    wait_thread_func.start()

    gen_thread_func = threading.Thread(target=gen_thread_function)
    gen_thread_func.start()

    timeVal = datetime.datetime.now()

    while True:
        currentTime = datetime.datetime.now()

        if (currentTime - timeVal).seconds > 10:
            print('Python Main running ...')

    thread.join()
    gen_thread.join()

我遇到了两个问题

  1. 当“wait_thread_function”先启动时,python程序被阻止
  2. 当“gen_thread_function”先启动时,显示 Abort 错误信息

所以我的问题是

  1. 我猜第一个问题是由 python GIL 引起的,因为“IntegerQueue” Pop 函数使用 std::mutex 所以我想知道 “如何在 Pop 函数中释放 GIL "
  2. 如何从 python 文件在 boost python 中执行 std::thread?
  3. IntegerQueue 是否可以共享 python 文件和提升 python 模块?
  4. 如果队列存储自定义 class 类型(不是原始数据类型),它还与 python 文件和提升 python 模块共享?

我的最终目标是基于生产者和消费者模型以及通过队列对象共享的自定义对象类型数据

请帮帮我

谢谢

环境

附加信息

弹出函数代码片段

    bool Pop(T& obj)
    {
        std::unique_lock<std::shared_mutex> ul(sm);

        cv.wait(ul, [this] {return (!con.empty() || !isRun); });

        if (!isRun)
        {
            return false;
        }

        if (!con.empty())
        {
            obj = con.front();
            con.pop();
            return true;
        }

        return false;
    }

============================================= ===========================

当“gen_thread_function”运行 第一时出现错误信息

好的。我找到了解决这些问题的方法..

  1. 我找到了使用 scoped gil release 的方法。这个question对我很有帮助

  2. 当我 运行 线程时,我遇到上面的错误 windows... 这是因为我无法加入 C++ 模块中的线程。我在 运行 函数中添加了线程连接代码,错误消失了

  3. 我认为直接共享一个队列有很多问题..所以我改变了架构。驻留在 C++ 模块中的队列对象,并公开访问队列的函数。而且效果很好

  4. 同解法三,我解决了暴露C++的问题class

谢谢