为什么使用了EnterCriticalSection之后指针字符串添加字符还会引发访问冲突?
代码如下
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
单看你这段代码,即使你不用lock也不会有冲突,因为你的线程会等待setevent后才会继续,所以问题不在这部分,你需要明确你的问题。