|
|
1
1
答案是:如果(并且仅当)两个线程可以同时使用相同的共享资源,则需要锁定。关于您的具体实施,没有足够的信息,但我没有什么评论:
|
|
|
2
0
你需要读者获得一个锁-事件的使用是不可替代的。没有它,作者就可以在读卡器代码的任何位置开始写作。 |
|
|
3
0
您绝对需要使用者锁定,以防止生产者在读卡器可以读取之前附加到文件。想象一下这个场景:
接下来会发生什么取决于指定的事件是手动重置还是自动重置。如果它是自动重置的,那么消费者将看到第二个信号,然后返回并再次读取相同的内容。如果是手动重置,那么消费者将重置事件并错过生产者写的最后一件事。 请注意,即使有了锁,如果生产者能够足够快地作出响应,那么您也有一个竞争条件。也就是说,在消费者能够读取第一条记录之前,生产者可能能够将第二条记录放入文件中。 您在这里看到的似乎是一个文件中实现的FIFO队列,并且您取决于消费者处理数据的速度比生产者创建数据的速度快。如果你能 保证 那样的行为,你就没事了。否则,消费者将不得不跟踪它最后一次读取的位置,以便知道下一次应该读取的位置。 |
|
|
4
0
在读者中,你可能需要寻找你点击EOF的地方,然后才能再次阅读。 如果您确定写入程序总是在追加,并且可以知道记录的结束位置(例如,它们总是10个字节),并且可以接受一个小的延迟,并且写入程序总是写入完整的记录,那么您可以在不使用互斥和事件的情况下完成此操作。用fileshare.readwrite打开文件,在读卡器中,继续寻找同一个位置并尝试读取您的记录,如果无法读取,则睡眠一秒钟。如果您能够读取整个记录,则会得到一个。找出你的位置,然后回过头去寻找那个地方,然后再读一遍。这就是tail-f在UNIX中的工作方式。 |
|
|
5
0
除了正常的同步功能外,您还可以使用 file change notification 在Windows上等待文件更改的API。 |
|
Suhail Gupta · 运动流中的数据丢失。这可能是什么原因? 8 年前 |
|
|
Pardeep Singh · Kafka消费者未获取所有消息 10 年前 |
|
|
perkss · Java:线程生产者消费者等待生成数据的最有效方法是什么 10 年前 |
|
atlaste · 删除原子/隔离数据中的数据 11 年前 |
|
|
paul · 生产者消费者平均等待时间未输出/缓冲查询 11 年前 |
|
|
user1108948 · 完成两项任务,然后打印一些内容 11 年前 |
|
|
user3485189 · 生产者/消费者-计算平均时间 12 年前 |