C++中的线程
Posted
技术标签:
【中文标题】C++中的线程【英文标题】:Threading in c++ 【发布时间】:2014-01-11 09:33:56 【问题描述】:假设我想从用户那里获取输入并在文本文件中搜索该输入。将对用户输入的每个字符执行搜索。将有一个循环执行搜索,并且将有另一个循环来检查用户是否输入了新字符。如果用户给出了新的字符,第二个循环将重新开始第一个循环。
请解释一下如何用 c++ 执行上述操作。我认为需要创建线程。
以下变量将用于维护公共值:
static var`
bool change;
while(!change)
change=false
<<do something, like search in file>>
其他循环如下:
while(1)
if(user enters another char)
var=new value input by the user;
change=true;
else change=false;
谢谢!
【问题讨论】:
使用std::thread
和std::atomic
也许阅读一些pthread tutorial 以了解基本概念。此外,您的问题可能是特定于操作系统的(标准 C++ 中没有办法只读取一次击键!)。也许你想使用Qt
thecodelesscode.com/case/126 => 你为什么这么肯定线程是解决你的问题所必需的?
我还能怎么解决这个问题??????
【参考方案1】:
这样的?现在我在ideone上写了这个,他们的线程对我不起作用,所以我无法测试它但是是的......接近这个的东西应该可以工作。可能是一个不好的例子。最好有线程池。
#include <iostream>
#include <thread>
#include <atomic>
#include <queue>
#include <mutex>
#include <chrono>
std::mutex lock;
std::atomic<bool> stop(false);
std::queue<std::function<void()>> jobs;
void One()
while(!stop)
if (!jobs.empty())
if (lock.try_lock())
std::function<void()> job = jobs.front();
jobs.pop();
lock.unlock();
job();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
void Two()
std::string var;
while(true)
if (std::cin>> var)
std::lock_guard<std::mutex> glock(lock);
jobs.push([] std::cout<<"Task added to the queue..\n";);
else
break;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
int main()
std::thread T(One);
Two();
stop = true;
T.join();
return 0;
【讨论】:
【参考方案2】:创建两个线程:一个用于读取用户输入,另一个用于执行搜索。
使用二进制信号量以消费者-生产者方式在两个线程之间进行同步,即一个线程获取信号量,另一个线程释放它:
static BinarySemaphore binSem;
static int inputCharacter = 0;
static void ReadUserInput();
static void PerformSearch();
void Run()
BinarySemaphore_Init(&binSem,0);
CreateThread(ReadUserInput,LOWER_PRIORITY);
CreateThread(PerformSearch,HIGHER_PRIORITY);
static void ReadUserInput()
while (inputCharacter != '\n')
inputCharacter = getc(stdin);
BinarySemaphore_Set(&binSem);
static void PerformSearch()
while (inputCharacter != '\n')
BinarySemaphore_Get(&binSem,WAIT_FOREVER);
// <<do something, like search in file>>
请注意,您需要创建执行搜索的线程,优先级高于读取用户输入的线程(如上面的代码)。
【讨论】:
以上是关于C++中的线程的主要内容,如果未能解决你的问题,请参考以下文章