C+中的多线程程序+;:在标志变量上使用互斥 我目前正在研究C++中的多线程代码,其中每个线程都被设置为执行一段代码,除非全局标志变为“强>真< /强>。线程将不共享任何数据,但全局标志除外。我想知道最好的做法是否是为国旗添加互斥
为了简化这个问题,我将使用以下简单的示例:假设您正在尝试查找一个大向量是否包含给定的整数,并且希望在多个线程之间分割搜索。存在一个全局变量,其初始值为FALSE。如果其中一个线程找到整数,它应该将标志设置为TRUE,然后所有线程都应该停止(如果一些线程执行一些额外的操作,直到它们意识到标志已更改,这是正常的) 下面的代码就是这么做的(我为cout上的竞争条件道歉,但我想保持代码简短)。它创建一个填充有500的大向量,将其中一个500替换为100,并执行搜索过程 代码可以编译并且似乎可以工作,但是我想知道在某个时候,标志的读/写是否会出错。我想知道是否应该为flag变量添加一个互斥体。我之所以犹豫不决,是因为(1)在大多数情况下,线程只会读取标志的值,(2)标志只会更改一次(它永远不会更改回false),(3)标志的值不会更改线程执行中的数据(除了停止它们之外,它什么也不做)(4)如果线程继续迭代几次就可以了 我是否应该只为functor中的编写部分添加互斥锁(flag=true)C+中的多线程程序+;:在标志变量上使用互斥 我目前正在研究C++中的多线程代码,其中每个线程都被设置为执行一段代码,除非全局标志变为“强>真< /强>。线程将不共享任何数据,但全局标志除外。我想知道最好的做法是否是为国旗添加互斥,c++,multithreading,mutex,C++,Multithreading,Mutex,为了简化这个问题,我将使用以下简单的示例:假设您正在尝试查找一个大向量是否包含给定的整数,并且希望在多个线程之间分割搜索。存在一个全局变量,其初始值为FALSE。如果其中一个线程找到整数,它应该将标志设置为TRUE,然后所有线程都应该停止(如果一些线程执行一些额外的操作,直到它们意识到标志已更改,这是正常的) 下面的代码就是这么做的(我为cout上的竞争条件道歉,但我想保持代码简短)。它创建一个填充有500的大向量,将其中一个500替换为100,并执行搜索过程 代码可以编译并且似乎可以工作,但是
向量a;
布尔标志=假;
整数大小=100000000
类Fctor{
int-s;
int t;
公众:
Fctor(ints,intt):s(s),t(t){
\\查找位置s和t之间的向量中是否有100
void运算符(){
int i=0;
对于(i=s;i cout将标志设置为原子执行作业将标志设置为原子执行作业请参见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;