【问题标题】:C++ Multi threadingC++ 多线程
【发布时间】:2012-09-14 10:58:30
【问题描述】:

我正在为使命召唤游戏编写一个 DLL,我做了很多工作,但我的问题在于下面的代码:

int func = 0;
-----
if (cl_ingame=1){ Sleep(35);start(); }

void start()
{
command(x,x, "c \"Press up for 11th\"");
func = 1;
Sleep(3000); 
command(x,x, "c \"Press up for Unlock all\"");
func = 2;

if (dpad = up){
if (func = 1){
do11th();
}else if (func = 2){
doUnlock();
} 
}

现在困扰的不是它自己的代码,而是 void “start” 将是一个循环,现在我的问题是,如果游戏已经启动,我将无法使用任何控件或调用任何函数忙循环一个,所以我需要找出如何为 C++ 线程化

我知道谷歌是男人最好的朋友,但它并没有真正解释得很详细,如果有人可以简单地给我一个示例线程就像这样

(线程) { 职能 }

如何停止线程以及如何调用/启动线程

非常感谢您的帮助

【问题讨论】:

  • 你应该看看 boost 线程
  • 代码和问题很不清楚。所以基本上你想知道如何启动和停止一个线程?如果是这样,那么网上有很多示例和教程。您具体遇到了什么问题?
  • 我需要做的就是知道如何将函数或代码放入一个单独的线程中,这样我就可以一次调用多个函数而无需等待一个函数完成,然后是一种启动/停止线程的方法.

标签: c++ multithreading


【解决方案1】:

启动一个线程很简单:

#include <thread>
#include <iostream>

void thread_entry(int arg)
{
    std::cout << "Thread running: argument " << arg << std::endl;
}

int main()
{
    std::cout << "Thread starting" << std::endl;
    std::thread thread(thread_entry, 42);
    thread.join();
    std::cout << "Thread finished" << std::endl;
}

在线程运行时与线程通信更复杂。不幸的是,标准 C++ 仍然相当缺乏高级并发性,所以首先使用标准库提供的原子变量、互斥体和条件变量可能是最容易的。简单地停止线程:

#include <thread>
#include <atomic>
#include <iostream>

void thread_entry(std::atomic<bool> & stop)
{
    while (!stop) {
        std::cout << "Thread running" << std::endl;
        sleep(1);
    }
}

int main()
{
    std::cout << "Thread starting" << std::endl;
    std::atomic<bool> stop(false);
    std::thread thread(thread_entry, std::ref(stop));
    sleep(5);
    stop = true;
    thread.join();
    std::cout << "Thread finished" << std::endl;
}

一般来说,线程间的同步比较复杂,容易出错。注意尽量减少线程之间共享的数据量,并仔细考虑您对这些数据所做的一切,确保它永远不会被一个线程访问,而另一个线程可能会更改它。

如果您正在编写游戏,那么更简单的方法可能是单线程事件循环。单个主循环将轮询输入事件并通知程序的各个组件它们已经发生;他们会相应地更新他们的状态,并可能产生更多他们自己的事件。唯一的复杂之处是每个事件处理程序必须快速完成其工作以避免阻塞整个程序。

【讨论】:

  • 感谢您的详细帖子!你有 Skype 我会把我的主要课程发给你,这样你就可以更好地理解我的问题。
  • 注意,使用 C++11 或 boost 启动线程很简单。在 OP 的问题中,他没有提到他正在使用的工具集。但是,如果他使用的是 C++11,那就是极好的示例。恭喜,西摩先生;是个男孩!
猜你喜欢
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多