gpt4 book ai didi

c++ - 如何在多线程 MEX 函数中打印到控制台?

转载 作者:搜寻专家 更新时间:2023-10-31 01:27:07 31 4
gpt4 key购买 nike

我正在编写一个使用 Boost 库的简单生产者消费者 MEX 函数。我已设法使以下程序正常运行。

#include "mex.h"
#include <boost/thread/thread.hpp>
#include <boost/lockfree/spsc_queue.hpp>
#include <iostream>
#include <boost/atomic.hpp>

int producer_count = 0;
boost::atomic_int consumer_count (0);
boost::lockfree::spsc_queue<int, boost::lockfree::capacity<1024> > spsc_queue;
const int iterations = 10000000;

void producer()
{
for (int i = 0; i != iterations; ++i) {
int value = ++producer_count;
while (!spsc_queue.push(value));
}
}

boost::atomic<bool> done (false);

void consumer()
{
int value;
while (!done) {
while (spsc_queue.pop(value))
++consumer_count;
}

while (spsc_queue.pop(value))
++consumer_count;
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (!spsc_queue.is_lock_free())
{
mexPrintf("boost::lockfree::queue is not lockfree\n");
mexEvalString("drawnow;");
}
else
{
mexPrintf("boost::lockfree::queue is lockfree\n");
mexEvalString("drawnow;");
}

boost::thread producer_thread(producer);
boost::thread consumer_thread(consumer);

producer_thread.join();
done = true;
consumer_thread.join();

cout << "produced " << producer_count << " objects." << endl;
cout << "consumed " << consumer_count << " objects." << endl;
}

最大的问题是我尝试将 mexPrintf() 包含到生产者或消费者方法中,MATLAB 就崩溃了。做了一些调查后,我发现 this post这解释了这是由于竞争条件而发生的。有谁知道我该如何解决这个问题?我阅读了关于 Mutex 的答案,但我不明白我将如何实现这样的功能。

最佳答案

您不能从除主线程之外的任何线程调用mexPrintf。互斥量不会解决您的问题。

来自MATLAB documentation :

MEX API Is Not Thread Safe

Do not call a single session of MATLAB® on separate threads from a MEX file. The MEX and Matrix Library APIs are not multi-threaded.

You can create threads from a C MEX file; however, accessing MATLAB from those threads is not supported. Do not call any MEX API functions from the spawned threads, including printf, which is defined as mexPrintf in the mex.h header file.

如果您真的需要从这些线程中生成输出,请考虑实现一个简单的消息传递系统,其中线程发布一条包含要输出的文本的消息和主线程,而不是等待 producer_thread.join() ;,循环查找要打印的消息,并使用 mexPrintf 打印它们。


下面的代码未测试。它甚至没有被编译。将其视为伪代码。我认为这是对解决方案的合理尝试,但可能有更好的方法。继续风险自负。 :)

boost::lockfree::queue<std::string> message_queue;

void producer() {
//...
message_queue.push("A string to print!");
//...
}

void mexFunction( /*...*/ ) {
// ...
boost::thread producer_thread(producer);
boost::thread consumer_thread(consumer);
while(producer_thread.joinable()) {
join_for(boost::chrono::milliseconds(50));
std::string s;
while (message_queue.pop(s)) {
mexPrintf("%s\n", s.c_str());
}
}
producer_thread.join();
done = true;
consumer_thread.join();
// ...
}

关于c++ - 如何在多线程 MEX 函数中打印到控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54010898/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com