gpt4 book ai didi

multithreading - 如何在线程内等待数据并将其写入文件的最佳实践?

转载 作者:行者123 更新时间:2023-12-03 15:09:28 24 4
gpt4 key购买 nike

我正在编写多线程应用程序。我有两个线程。 On 用于将一些数据从设备传输到全局数据缓冲区,第二个用于将这些数据写入文件。

从设备到缓冲区的数据正在异步传输。第二个线程的目的应该是等待指定数量的数据写入主数据缓冲区,最后将其写入文件。

第一个线程在 DLL 中,第二个线程在主应用程序中。我暂时用事件来解决这个问题。第一个线程将数据从设备传输到主数据缓冲区并对数据进行计数,当传输指定数量的数据时,它会设置一个事件。第二个等待事件发出信号,当事件发出信号时,它会运行一些数据存储代码。就这么简单,它正在工作。

  Thread1.Execute:

var DataCount, TransferedData: Integer;

DataCounter := 0;
while not Terminted do
begin
TransferData(@pData, TransferedData);
Inc(DataCounter, TransferedData)
if DataCounter >= DataCountToNotify then SetEvent(hDataCount);
end;



Thread2.Execute:

hndlArr[0] := hDataCount;
hndlArr[1] := hTerminateEvent;

while (not Terminated) do
begin
wRes := WaitForMultipleObjects(HandlesCount, Addr(hndlArr), false, 60000);
case wRes of
WAIT_OBJECT_0:
begin
Synchronize(WriteBuffer); // call it from main thread
ResetEvent(hndlArr[0]);
end;
WAIT_OBJECT_0 + 1:
begin
ResetEvent(hTerminateEvent);
break;
end;
WAIT_TIMEOUT: Break;
end;
end;

现在我想让第二个线程更加独立......这样我就可以创建第二个线程的多个实例,并且不需要等待第一个线程。我想将代码的数据计数部分从第一个线程移动到第二个线程,这样我就不再需要第一个线程中的数据计数。第一个仅用于数据传输目的。

我想使用第二个作为数据计数器并存储数据。但现在我必须循环并不断手动检查指定的数据量。如果我有 while 循环,我将不得不添加一些 sleep ,这样第二个线程就不会降低计算机性能,但我不知道 sleep 应该多长时间,而第一个线程中的数据传输速度不是恒定的,因此第二个线程中的计数速度会有所不同。

我猜这个代码示例不好:

  Thread2.Execute:
var DataCount: Integer;
DataIdx1 := GetCurrentDataIdx;
while (not Terminated) do
begin
if (GetCurrentDataIdx - DataIdx1) >= DataCountToNotify then
begin
Synchronize(WriteBuffer);
DataIdx1 := GetCurrentIdx;
end;
sleep(???);
end;

所以我的问题是解决数据计数并将其存储在第二个线程中的问题的最佳方法是什么?您有哪些经验和建议?

最佳答案

您遇到一些问题。 @LU RD 已经指出了一点——不要同步不需要同步的东西。目前尚不清楚“WriteBuffer”的作用,但我使用的文件系统和所有数据库都可以让一个线程打开文件/表并写入它们。

你的缓冲系统可能需要一些注意。是否有一些“指定的数据量”,或者这是一些允许延迟写入的概念数字?

通常,生产者和消费者线程在队列上交换多个缓冲区指针,因此避免共享任何单个缓冲区。鉴于这是一个 DLL,因此内存管理调用可能会出现问题,我可能也会通过在启动时创建一个缓冲区池来在系统中传输数据来避免它们。我会使用缓冲区类而不仅仅是指向内存的指针,但这不是绝对必需的(只是更简单/灵活/安全)。

Sleep() 循环是线程间通信的一种非常糟糕的方式。 Sleep() 确实有其用途,但这不是其中之一。 Delphi/Windows 有大量的同步机制 - 事件、信号量、互斥体等 - 使得这种轮询变得不必要。

LU RD 还提到了必须保留顺序的数据的并行处理问题。这通常需要另一个线程、列表样式的集合和序列号。在线程间通信正常工作之前我不会尝试这样做。

关于multithreading - 如何在线程内等待数据并将其写入文件的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777816/

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