2

I'm using the thread library on c++11 to do some things. The problem is that i have a limited number of threads (4).

I would know how to deal with it:

#include <iostream>
#include <string>
#include <vector>
#include <thread>

#define NUMBER_OF_THREADS 4

void foo(const std::string& astring)
{
    std::cout << astring << std::endl;
}

int main()
{
    std::vector<std::string> list_of_strings(100);
    // values assigned
    std::vector<std::thread> list_of_threads(NUMBER_OF_THREADS);
    for(std::vector<std::string>::const_iterator it_string = list_of_strings.begin() ; it_string != list_of_strings.end() ; ++it_string)
    {
        bool check = false;
        unsigned int = 0;
        while(!check) // loop which assigns the next task to the first thread ready.
        {
            if( check = list_of_threads.at(i).ISFREE()) // how to do ?
            {
                list_of_threads.at(i) = thread(&foo,*it_string);
            }
            else
            {
                i = (i + 1) % NUMBER_OF_THREADS;
            }
        }
    }
    for(std::vector<std::thread>::iterator it = list_of_threads.begin() ; it != list_of_threads.end() ; ++it)
        it->join(); // the main thread is waiting for all threads before closing.
    return 0;
}

But i don't know how to check if the thread is ready for a new task or not. Any idea ?

4

3 回答 3

5

通常的解决方案是将任务存储在共享队列中(受互斥锁和条件变量保护),并让每个线程在完成当前任务时检查其他任务。这样,每个线程都保持忙碌,而程序的其余部分可以幸福地保持对分配的无知。

于 2013-09-30T12:19:59.120 回答
3

没有好的内置方式。您可以使用whichstd::async代替std::threadwhich 返回std::future您可以查询的 a - 这在一般情况下可能更可取,因为它完全按照您正在做的事情 - 处理工作项,而无需启动 OS 线程的全部开销。

或者,您可以让您的线程发出信号表明它已完成(例如通过std::atomic或更可能std::condition_variable),然后.join()从主线程发出信号以确保其真正终止。

于 2013-09-30T12:17:18.690 回答
0

我不熟悉std::thread,但假设没有更好的线程类具有您需要的功能(也许请参阅 Mikes 的回答),我建议基于std::thread 编写您自己的线程类。std::thread 将获得一个指向您自己的成员函数的函数指针,它设置一个线程忙的内部标志,然后调用从外部提供的函数,然后重置所述标志。添加一个IsBusy()返回标志状态的方法,你就完成了。

于 2013-09-30T12:20:32.373 回答