多线程动画0xC0000005错误
0xC0000005 Error on Multi Thread Animation
所以我使用 C++ 控制台制作了一个应用程序,多线程如下所示,然后我0x0000005出现错误。
它第一次运行时像往常一样工作。谁能帮我解决这个问题?
我正在使用 Code::Blocks IDE 和 Borland C++ 5.5,我计划将其制作成 Borland C++ 5.02
#include <windows.h>
#include <stdio.h>
#include <dos.h>
#include <iostream.h>
#include <conio.h>
void linesmov(int mseconds, int y);
void linesmov(int mseconds, int y)
{
int i=0;
while (true)
{
i=i+1;
// Or system("cls"); If you may...
gotoxy(i,y);
cout << "____||____||____";
gotoxy(i-1,y);
cout << " ";
Sleep(mseconds);
if (i>115)
{
i=0;
for(int o = 0; o < 100; o++)
{
gotoxy(0,y);
cout << " ";
}
}
}
}
DWORD WINAPI mythread1(LPVOID lpParameter)
{
printf("Thread inside %d n", GetCurrentThreadId());
linesmov(5,10);
return 0;
}
DWORD WINAPI mythread2(LPVOID lpParameter)
{
printf("Thread inside %d n", GetCurrentThreadId());
linesmov(30,15);
return 0;
}
int main(int argc, char* argv[])
{
HANDLE myhandle1;
DWORD mythreadid1;
HANDLE myhandle2;
DWORD mythreadid2;
myhandle1 = CreateThread(0,0,mythread1,0,0,&mythreadid1);
myhandle2 = CreateThread(0,0,mythread2,0,0,&mythreadid2);
printf("Thread after %d n", mythreadid1);
getchar();
return 0;
}
包括我的评论中的所有这些解决方案绝对不是应该这样做的方式。主要问题是线程之间缺乏同步以及缺乏处理它们的终止。此外,应检查每个函数的线程安全兼容性,或者应包装以匹配它。
考虑到自 c++11 以来std::cout
我们有一些数据竞争保证:
并发访问同步 (§27.5.3.4) 标准 iostream 对象的格式化和未格式化输入 (§27.7.2.1) 和输出 (§27.7.3.1) 函数或由多个线程组成的标准 C 流应 不会导致数据争用 (§1.10)。[ 注意:用户仍必须 同步多个对象和流的并发使用 线程,如果他们希望避免交错字符。— 尾注 ]
因此,根据此注释,同步原语的 lask 是被遗忘的。
考虑处理线程终止。
HANDLE threadH = CreateThread(...);
...
TerminateThread(threadH, 0); // Terminates a thread.
WaitForSingleObject(threadH, INFINITE); // Waits until the specified object is in the signaled state or the time-out interval elapses.
CloseHandle(threadH); // Closes an open object handle.
TerminateThread(),但请注意此解决方案,因为..
WaitForSingleObject()
这只是线程安全方式的第一步。
我想推荐 C++ Anthony Williams 的 Concurrency in Action: Practical Multithreading 以供进一步阅读。
用于同步输出的粗鲁解决方案
#include <Windows.h>
#include <iostream>
#include <mutex>
std::mutex _mtx; // global mutex
bool online = true; // or condition_variable
void gotoxy(int x, int y)
{
COORD c = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
void linesmov(int mseconds, int y) {
int i = 0;
while (online) {
i = i + 1;
// Or system("cls"); If you may...
_mtx.lock(); // <- sync here
gotoxy(i, y);
std::cout << "____||____||____"; gotoxy(i - 1, y);
std::cout << " ";
_mtx.unlock();
Sleep(mseconds);
if (i > 75)
{
i = 0;
for (int o = 0; o < 60; o++)
{
_mtx.lock(); // <- sync here
gotoxy(0, y);
std::cout << " ";
_mtx.unlock();
}
}
}
}
DWORD WINAPI mythread1(LPVOID lpParameter)
{
std::cout << "Thread 1" << GetCurrentThreadId() << std::endl;
linesmov(5, 10);
return 0;
}
DWORD WINAPI mythread2(LPVOID lpParameter)
{
std::cout << "Thread 2" << GetCurrentThreadId() << std::endl;
linesmov(30, 15);
return 0;
}
int main(int argc, char* argv[])
{
DWORD mythreadid1;
DWORD mythreadid2;
HANDLE myhandle1 = CreateThread(0, 0, mythread1, 0, 0, &mythreadid1);
HANDLE myhandle2 = CreateThread(0, 0, mythread2, 0, 0, &mythreadid2);
std::cout << "Base thread: " << GetCurrentThreadId() << std::endl;
getchar();
online = false;
WaitForSingleObject(myhandle1, INFINITE);
WaitForSingleObject(myhandle2, INFINITE);
CloseHandle(myhandle1);
CloseHandle(myhandle2);
return 0;
}
a) 两个 gotoxy 不通过 std::cout 输出都不是线程安全/同步的。您需要进程范围的互斥锁来同步该
b) 异常可能是由于您没有在 main 中使用WaitForMultipleObjects
来等待线程完成。根据硬件和优化,main 可能会在线程完成其工作之前退出。
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 进程返回 -1073741819 (0xC0000005) 错误
- C++ rezing 动态数组最多可以处理一定数量的元素,但在某些时候会崩溃并显示错误 (0XC0000005)
- OPENCV.3.0错误:0xc0000005:访问违规读取位置0x00000000
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- 多线程动画0xC0000005错误
- 什么是错误 (0xC0000005) 以及如何修复它
- Visual Studio C++ 0xC0000005错误:对内存分配感到困惑
- C 错误:0xc0000005:访问违规写作位置0xfeeefeee
- C++数组错误:访问冲突读取位置0xC0000005
- 运行时错误0xC0000005 - 访问冲突
- 错误 linkedlist .exe 中0x00D0345E处的未处理异常: 0xC0000005:访问违规写入位置0x
- C++随机0xC0000005错误
- 我收到此错误"Unhandled exception at 0x009437bd in Hash functions.exe: 0xC0000005: Access violation reading
- JRE检测到致命错误- EXCEPTION_ACCESS_VIOLATION (0xc0000005)
- 无法在 ADO OLEDB 中捕获 CommitTrans 当它给出0xc0000005错误时
- C++,错误,本机"已退出,代码为 -1073741819 (0xc0000005)
- 从C#调用非托管C++库(dll)会产生访问冲突错误(0xc0000005)
- Visual Studio 2012 错误 0xC0000005 数组输出
- VS2013错误0xC0000005:当使用libcurl