用c ++进行线程化

时间:2014-01-11 09:33:57

标签: c++ multithreading synchronization

假设我想从用户那里获取输入并在文本文件中搜索该输入。将对每个字符用户输入执行搜索。将有一个执行搜索的循环,并且将有另一个循环来检查用户是否输入了新字符。如果用户给出了新的char,则第二个循环将重新启动第一个循环。

请解释如何使用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;
}

谢谢!

2 个答案:

答案 0 :(得分:0)

创建两个线程:一个用于读取用户输入,另一个用于执行搜索。

使用二进制信号量以消费者 - 生产者方式在两个线程之间进行同步,即一个线程获取信号量,另一个线程释放信号量:

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>>
    }
}

请注意,您需要创建执行搜索的线程,优先级高于读取用户输入的线程(如上面的代码所示)。

答案 1 :(得分:0)

这样的东西?现在我在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;
}