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::threadstd::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++中的线程的主要内容,如果未能解决你的问题,请参考以下文章

标准 C++ 中的异步线程

c++中的Posix线程

C++ 多线程环境中的内存访问

为啥 C++ 中的多线程会降低性能

c++ 中的多线程线程安全动画建议

试图理解 C++ 中的线程