C ++多线程问题

时间:2011-05-01 09:49:15

标签: c++ multithreading

我最近制作了一个非常简单的应用程序,只是将矩阵效果打印到控制台。所以我用一个非常容易使用的函数void drawLine(int startX, int startY, int lineLength,int speed);制作了它。现在的问题是它一次只打印一行。当然我需要使这个应用程序多线程,但我发现自己很难,因为我从来没有用C ++做过,只有在C#和C#中,与C ++相比它很容易做到。

我做了一些研究并尝试使用CreateThread创建3个主题,然后使用WaitForMultipleObjects启动它们。但输出非常奇怪,似乎不正确。即使这可以正常工作,它也会导致我遇到下一个问题。想象一下,我想在我的控制台上启动超过15行,这是否意味着我需要创建15个不同的线程?

请注意,这不重要,它只是我刚刚创建的东西,因为我很无聊,也因为我想学习使用C ++进行线程化。我当然可以使用boost库,但我想为自己创建一个没有使用它的例子。

这是一个包含1个主题的屏幕截图,只是为了让它更清晰: enter image description here

2 个答案:

答案 0 :(得分:2)

此问题与线程无关 - 或者说,此问题绝对不需要线程。简单的面向对象设计应该可以轻松地在框架中绘制多条线 - 您认为单线程游戏如何在框架中绘制数千个或更多顶点?

更重要的是,只有最新的(Windows Vista或更高版本)Windows渲染器允许多线程渲染 - 即Direct2D / Direct3D11。像D3D9这样的其他渲染器可以保存内部锁,防止多线程渲染,因为它们的运行时和图形驱动程序无法处理它。

如果你有一个像Direct2D这样的并发安全渲染器,那么从多个线程渲染它应该相对简单 - 你不应该使用本机Windows线程API。我看到你正在使用Visual Studio 2010-使用并发运行时。 WinAPI只提供线程原语 - 直接使用它们就像在汇编程序中编写一样。至少使用boost::thread。线程并不是真正的实现,它是关于良好的设计,而设计与您用于实现它的库无关。

编辑:等一下,您正在使用控制台?这根本不是线程安全的。那是疯了。控制台存在最基本的I / O,而不是这个。最有可能的是C#只是为你同步而C ++没有。

答案 1 :(得分:0)

函数drawLine可能是一个循环,带有一个定位光标的命令,然后打印字符(如果没有则显示功能代码)。这两条指令必须按顺序执行,而其他线程的其他指令不会执行。因此,引入一个锁(AKA关键部分)来保证这两个指令有序地执行。功能顺序是这样的:

EnterCriticalSection
SetConsoleCursorPosition
SetConsoleTextAttribute
WriteConsole
LeaveCriticalSection

关键部分在所有线程之间共享。

单线程方法也是一种选择,因为矩阵字符串不会相互作用。简单的解决方案是这样的:保留所有矩阵字符串的内存数据,并在单线程中一个接一个地绘制它们。绘制完所有字符串后稍微睡一会儿。希望动画看起来很合理。

更复杂的解决方案是使用简单的解决方案,但要有两个屏幕缓冲区(使用CreateConsoleScreenBuffer和SetConsoleActiveScreenBuffer),并不断切换它们以实现即时绘图。