我使用以下代码同时使用多个内核写入文件或标准输出:
f:write(x, "\t", y, "\n")
print(x, '\t', y, '\n')
如何在没有比赛的情况下使这些陈述成为原子?
更新:似乎我的问题引起了混乱。因此,我会问更具体的问题:如果我在不同的处理器上运行上面的代码但是将输出传输到同一个文件中,我怎样才能确保不同处理器的输出保持不同的行?
答案 0 :(得分:5)
Lua本身并不支持真正的多线程。所以没有比赛这样的问题。
请注意,这意味着您的代码f:write
和print
不会同时执行,即使在多核处理器中也是如此。
答案 1 :(得分:1)
如果使用..
将子字符串连接在一起,则可以增加将结果字符串一次性传递给操作系统的机会。
f:write( x .. "\t" .. y .. "\n" )
f:flush()
io.write( tostring( x ) .. "\t" .. tostring( y ) .. "\n" )
io.flush()
这个可能足以应对日志记录等不重要的任务。如果不够好,则需要序列化输出操作。一种可能性是文件锁定。受欢迎的luafilesystem模块(可移植到所有主要桌面操作系统)包含lock
和unlock
功能,用于此目的:
local lfs = require( "lfs" )
while not lfs.lock( f, "w" ) do end
f:write( x, "\t", y, "\n" )
f:flush()
lfs.unlock( f )
f:close()
不幸的是你必须忙着等待锁定。如果您能够使用luaposix中的fcntl
函数(仅适用于Linux或MacOS等POSIX操作系统),则可以调用进程块直到获取锁定为止(参见here例如,但使用F_SETLKW
代替F_SETLK
)。 (对于print
情况,我会在某处使用临时文件上的锁 - 我还没有找到一个Lua模块,它提供对信号量或等效信号的访问。)