linux - 将不同 parfor 工作线程/线程的 fprintf 和 disp 输出重定向到单独的窗口

标签 linux multithreading matlab unix printf

我有数千行 MATLAB 代码,可实现对 fMRI 脑成像数据的不同计算密集型操作。许多操作可以在多个并行线程中运行,但问题是不同线程/ worker 的所有 fprintfdisp 输出都打印在同一个窗口上。

我编写了一个自定义多线程代码,在 Linux 环境中使用 unix 命令派生出新的 MATLAB 实例。因此,我首先写出 .m 文件 PreprocessSubj1.m、PreprocessSubj2.m、PreprocessSubj3.m 和 PreprocessSubj4.m,每个文件都包含相同的计算,但针对不同的主题。这 4 个 MATLAB 函数完全相互独立。

CellArrayOfFunctions = { 'PreprocessSubj1', 'PreprocessSubj2', ...
'PreprocessSubj3', 'PreprocessSubj4' };

CellArrayOfFunctions_i = 1;

while (CellArrayOfFunctions_i <= size(CellArrayOfFunctions, 2))
    FunctionToBeRun = CellArrayOfFunctions{CellArrayOfFunctions_i};
    unix([ 'matlab -desktop -r ', FunctionToBeRun, ' &' ]);
    CellArrayOfFunctions_i = CellArrayOfFunctions_i + 1;
end

我认为使用 unix 来 fork MATLAB 线程是一件很麻烦的事情。我想使用 parfor 实现此代码,以获得更好的可维护性和更小的内存使用量。但是有什么方法可以将不同线程/工作线程的 fprintf(和 disp)输出重定向到单独的窗口?

谢谢你:)

最佳答案

您可能想写入/dev/pts/#,其中 # 表示窗口。你可以这样做:

output1 = fopen('/dev/pts/0', 'w');
output2 = fopen('/dev/pts/1', 'w');
fwrite(output1, 'Data to window 1');
fwrite(output2, 'Data to window 2');

不过,您需要确定在/dev/pts/之后放置哪些数字。每次打开一个新终端时,都会出现一个与该终端对应的新文件,因此您可以使用 !ls/dev/pts 检查可用的终端。

关于linux - 将不同 parfor 工作线程/线程的 fprintf 和 disp 输出重定向到单独的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10075323/

相关文章:

c - ELF 二进制文件的运行时修补

c - 消息队列是否加锁

r - 包 ‘raster’ 的安装具有非零退出状态

multithreading - 让 Rust 线​​程摆脱阻塞操作的标准方法是什么?

matlab - 如何连接字符串和数字来制作表格?

linux - Unix 系统的 SetThreadAffinityMask

c# - 线程安全通用规则

java - 如何将对象上的字段设置为 Final 以避免线程在同一对象上看到空引用?

matlab - 如何在 MATLAB 中生成大小可变的随机值矩阵?

image - 在matlab中,colormap对图像没有影响