【问题标题】:write fails in same file from two processes两个进程在同一个文件中写入失败
【发布时间】:2017-06-24 12:03:28
【问题描述】:

我的 Dll 将数据写入文件“Sample.txt”。

如果 Dll 由两个进程加载,则 Sample.txt 将由两个进程写入。

在这种情况下,只有先写入文件的进程才会继续写入文件。我在 Sample.txt 中看不到第二个进程的数据。我使用 Mutex 在进程之间进行同步。

我的代码如下,

HANDLE MLock = CreateMutex(NULL,FALSE,L"MLock");
WaitForSingleObject(MLock,INFINITE);
ofstream fp;
fp.open("Sample.txt",ios::app);
fp <<  GetCurrentProcessID();
fp.close();
ReleaseMutex(MLock);

我只能在 Sample.txt 中看到第一个进程的 ID。只有当第一个进程被杀死时,才会写入第二个进程数据。我哪里错了?

注意:这个问题只发生在少数机器上。

【问题讨论】:

  • 您是否从示例中发出错误处理?注意CreateMutex 可以返回NULL
  • 另外,WaitForSingleObject 也可以返回不同的结果。您可以查看示例 here,了解如何使用带有 CreateMutexWaitForSingleObject 的互斥锁
  • 虽然,我可能会推荐使用lock_guard
  • @Default lock_guard 在进程间工作?刚才检查了一下,“是的”我在 CreateMutex 中得到了 NULL。但是 GetLastError 没有返回任何错误。
  • @Default 抱歉之前的评论。 GetLastError 返回 ACCESS_DENIED

标签: c++ multithreading c++11 mutex


【解决方案1】:

试试这个:

HANDLE MLock = CreateMutex(NULL,FALSE,L"MLock");
if (NULL == MLock)
      MLock = OpenMutex(MUTEX_ALL_ACCESS,FALSE,L"MLock");

if (NULL == MLock){
   // error return 
}

WaitForSingleObject(MLock,INFINITE);
//...

【讨论】:

  • 请检查 cmets。!我试过了..即使这样也给了我同样的错误
  • 是的.. 似乎评论在增长时会自动隐藏:-/
猜你喜欢
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多