为什么使用了EnterCriticalSection之后指针字符串添加字符还会引发访问冲突?

发布于 2022-09-12 23:45:22 字数 1265 浏览 42 评论 0

代码如下

MemLock Locker;
LPSTR hComWriteBuffer;
DWORD dwComBytesToWrite;
HANDLE    hComSendEvent;
void main()
{
  hComSendEvent = ::CreateEvent(nullptr, TRUE, FALSE, nullptr);
  hComWriteBuffer = "G90";
  (HANDLE)::_beginthreadex(nullptr, 0, ThreadComWrite, nullptr, 0, nullptr);
  Locker.lock();
  *(hComWriteBuffer + 4) = '\n';
  *(hComWriteBuffer + 5) = '\0';
  Locker.unlock();
  dwComBytesToWrite = strlen(hComWriteBuffer);
  SetEvent(hComSendEvent);
}

//串口写线程
unsigned int __stdcall  ThreadComWrite(void* pv)
{
  ...
  WaitForSingleObject(hComSendEvent, INFINITE))
  WriteFile(hCom, hComWriteBuffer, dwComBytesToWrite, NULL, &oEvt);\
  ...
}

class MemLock
{
public:
    MemLock()
    {
        ::InitializeCriticalSection(&locker);
    }
    ~MemLock()
    {
        ::DeleteCriticalSection(&locker);
    }

    void lock()
    {
        ::EnterCriticalSection(&locker);
        Busy = 1;
    }

    void unlock()
    {
        ::LeaveCriticalSection(&locker);
        Busy = 0;
    }

    bool try_lock()
    {
        return !!::TryEnterCriticalSection(&locker);
    }

    bool IsBusy()
    {
        return (bool)Busy;
    }

private:
    CRITICAL_SECTION    locker;
    WORD                Busy;
};



如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倾城花音 2022-09-19 23:45:22

单看你这段代码,即使你不用lock也不会有冲突,因为你的线程会等待setevent后才会继续,所以问题不在这部分,你需要明确你的问题。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文