Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的多线程程序+;:在标志变量上使用互斥 我目前正在研究C++中的多线程代码,其中每个线程都被设置为执行一段代码,除非全局标志变为“强>真< /强>。线程将不共享任何数据,但全局标志除外。我想知道最好的做法是否是为国旗添加互斥_C++_Multithreading_Mutex - Fatal编程技术网

C+中的多线程程序+;:在标志变量上使用互斥 我目前正在研究C++中的多线程代码,其中每个线程都被设置为执行一段代码,除非全局标志变为“强>真< /强>。线程将不共享任何数据,但全局标志除外。我想知道最好的做法是否是为国旗添加互斥

C+中的多线程程序+;:在标志变量上使用互斥 我目前正在研究C++中的多线程代码,其中每个线程都被设置为执行一段代码,除非全局标志变为“强>真< /强>。线程将不共享任何数据,但全局标志除外。我想知道最好的做法是否是为国旗添加互斥,c++,multithreading,mutex,C++,Multithreading,Mutex,为了简化这个问题,我将使用以下简单的示例:假设您正在尝试查找一个大向量是否包含给定的整数,并且希望在多个线程之间分割搜索。存在一个全局变量,其初始值为FALSE。如果其中一个线程找到整数,它应该将标志设置为TRUE,然后所有线程都应该停止(如果一些线程执行一些额外的操作,直到它们意识到标志已更改,这是正常的) 下面的代码就是这么做的(我为cout上的竞争条件道歉,但我想保持代码简短)。它创建一个填充有500的大向量,将其中一个500替换为100,并执行搜索过程 代码可以编译并且似乎可以工作,但是

为了简化这个问题,我将使用以下简单的示例:假设您正在尝试查找一个大向量是否包含给定的整数,并且希望在多个线程之间分割搜索。存在一个全局变量,其初始值为FALSE。如果其中一个线程找到整数,它应该将标志设置为TRUE,然后所有线程都应该停止(如果一些线程执行一些额外的操作,直到它们意识到标志已更改,这是正常的)

下面的代码就是这么做的(我为cout上的竞争条件道歉,但我想保持代码简短)。它创建一个填充有500的大向量,将其中一个500替换为100,并执行搜索过程

代码可以编译并且似乎可以工作,但是我想知道在某个时候,标志的读/写是否会出错。我想知道是否应该为flag变量添加一个互斥体。我之所以犹豫不决,是因为(1)在大多数情况下,线程只会读取标志的值,(2)标志只会更改一次(它永远不会更改回false),(3)标志的值不会更改线程执行中的数据(除了停止它们之外,它什么也不做)(4)如果线程继续迭代几次就可以了

我是否应该只为functor中的编写部分添加互斥锁(flag=true)

向量a;
布尔标志=假;
整数大小=100000000
类Fctor{
int-s;
int t;
公众:
Fctor(ints,intt):s(s),t(t){
\\查找位置s和t之间的向量中是否有100
void运算符(){
int i=0;
对于(i=s;icout将标志设置为原子执行作业

将标志设置为原子执行作业

请参见
std::atomic
请参见
std::atomic
vector <int> a;
bool flag = false;
int size = 100000000

class Fctor {
    int s;
    int t;
 public:
    Fctor(int s, int t) : s(s), t(t) {}
    \\ finds if there is a 100 in the vector between positions s and t
    void operator()() { 
        int i = 0;
        for (i = s; i < t; i++) {
            if (flag == true) break;
            if (a[i] == 100) {
                    flag = true;
                    break;
            }
        }
    cout << s << " " << t << " " << flag << " " << i << "\n";
    }
};

int main() {

    a = vector<int> (8 * size, 500); \\creates a vector filled with 500
    a[2*size+1] = 100; // This position will have a 100
    chrono::high_resolution_clock::time_point begin_time = 
        chrono::high_resolution_clock::now();
    int cores = 4;
    vector<std::thread> threads;
    int num = 8/cores;
    int s = 0;
    int t = num * size;
    Fctor fctor(s, t);
    std::thread th(fctor);
    threads.push_back(std::move(th));

    for (int i = 1; i < cores; i++) {
            int s1 = i * num * size+1;
            int t1 = (i+1) * num * size;
            Fctor fctor1(s1, t1);
            std::thread th1(fctor1);
            threads.push_back(std::move(th1));
    }
    for (std::thread& th : threads) {
            th.join();
    }

    chrono::high_resolution_clock::time_point end_time = 
        chrono::high_resolution_clock::now();
    chrono::duration<double> time_span = 
        chrono::duration_cast<chrono::duration<double> >(end_time - 
        begin_time);
    cout << "Found in: "<< time_span.count() << " seconds. \n";
    return 0;