访问冲突读取位置0xfeeefef2多线程编程c++窗口
Access violation reading location 0xfeeefef2 multithreaded programming c++ windows
我有以下代码:
-生成一个包含"e"个节点的链表,每个节点分配了一个随机值,以及工作编号
-创建w个线程,每个线程在列表中检查节点的工作编号是否等于其线程id,如果是,则从值
进行SQRT。——当列表中的5或所有值都小于2时,主线程从列表中删除小于2的元素
-一次只能运行3个线程。
代码如下:
DWORD WINAPI work(LPVOID argument){
int tid = *((int *)argument);
elem* p = head;
while(p!=NULL){
if (tid == p->worker){
WaitForSingleObject(semaphor, 0L);
double val = p->value;
p->value = sqrt(val);
if (p->value < 2){
EnterCriticalSection(&countMutex);
count++;
if(count == maxCount){
WakeConditionVariable (&conditionalVar);
}
LeaveCriticalSection(&countMutex);
}
Sleep(1);
ReleaseSemaphore(semaphor, 1L, NULL);
}
if (p->next == NULL)
p = head;
else
p = p->next;
}
return NULL;
}
int _tmain(int argc, _TCHAR* argv[])
{
//generate list, create threads (the threads are assigned to the work function)
EnterCriticalSection(&countMutex);
while(e > 0){
SleepConditionVariableCS(&conditionalVar, &countMutex, INFINITE);
deleteElements();
if (e < 5)
maxCount = e;
count = 0;
cout << "After erasure: n";
printList();
cout << "n";
}
LeaveCriticalSection(&countMutex);
//free space
}
问题是,在第一次删除后,我得到错误"在mainW.cpp.exe: 0xC0000005中0x00fe1c8e未处理异常:访问违规读取位置0xfeeefef2。"
我意识到这意味着在某个地方我试图访问一个已经被删除的值,但我不知道为什么,因为列表是同步的。
在没有任何锁的情况下遍历列表
if (p->next == NULL)
p = head;
else
p = p->next;
如果主线程刚刚删除了p->next
怎么办?
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 模板元编程:如何将参数包组合成新的参数包
- Qt Q串行端口未编程设备未关闭
- 模板元编程 - 尝试实现维度分析
- 我是编程新手
- C++编程从外部文本文件定义数组大小
- 了解算法的性能差异(如果以不同的编程语言实现)
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 使用命名空间正确编程
- C++编程:运算符重载中的引用如何工作?
- Arduino 模块化编程与全局和设置
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 试图修复一个错误,该错误不会让我开始编程其余部分
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 如何使用可变参数模板类使用模板元编程获得最大值