gpt4 book ai didi

c++ - Thread c++ 防止值改变

转载 作者:太空宇宙 更新时间:2023-11-04 14:23:35 27 4
gpt4 key购买 nike

我正在使用 boothread 创建 3 个线程,每次调用相同的函数并传递不同的参数。例如。 1/thread.add(function, int a1, std::string b), thread.add(function, int a2, std::string b), thread.add(函数, int a3, std::string b), thread.add(function, int a4, std::string b)

当线程中的全局值发生变化时,我不希望其他线程执行并再次更改值例如函数(a,b){

如果(该线程发生了某些事情)值 = 5;

//如果什么都没发生值 = 1;

如果一个线程的值为 5,那么我不希望其他线程干扰该值并使其返回 1。我该怎么做?谢谢。

也许这样做的方法是使用 boost:mutex 但我没有看到这样做有任何好处,因为这个值只是被发现在 return 语句之前,我很可能已经使用了 boost join_all()。但这会降低效率。

最佳答案

我有一个例子可以帮助你。它使用 C++11,但可以轻松转换为 Boost。

算法很简单,主要由两部分组成:

  1. 启动三个线程
  2. 加入他们(等待他们完成)

每个线程的作用:

  1. 做一些工作
  2. 初始化一个变量,如果它之前从未被初始化(FirstThreadToFinish)

独特的初始化函数是如何工作的。 1.使用互斥量来防止对共享变量的多次访问(保证一次只能由一个线程访问该函数) 2.如果变量还没有被初始化,它用线程的名字初始化它,并将 bool 值设置为真(变量初始化) 3.否则什么都不做

#include "stdafx.h"
#include <thread>
#include <chrono>
#include <mutex>
#include <iostream>
#include <string>
using namespace std;

mutex m;//to synchronize the data properly
string FirstThreadToFinish;
bool IsInitialized;

//This function is called by the main thread: does the work and initializes the variable only once
int MyThreadFunction(int Duration, const string & ThreadName);

//this function does some work (put here what your thread is really supposed to do)
int DoSomeWork(int Duration);

//this function initializes the variable only once and does nothing otherwise
int InitializeVariableOnce(int Duration, const string & ThreadName);

//this function initializes the variable only once and does nothing otherwise
int InitializeVariableOnce(int Duration, const string & ThreadName)
{
std::lock_guard<mutex> l(m);
if (!IsInitialized)
{
FirstThreadToFinish=ThreadName;
IsInitialized=true;
cout<<"FirstThreadToFinish= "<<ThreadName<< ", IsInitialized= "<<IsInitialized<<endl;
}
return 0;
}

//this function does some work (put here what your thread is really supposed to do)
int DoSomeWork(int Duration)
{
std::this_thread::sleep_for(std::chrono::seconds(Duration));
return 0;
}

int MyThreadFunction(int Duration, const string & ThreadName)
{
DoSomeWork(Duration);
InitializeVariableOnce(Duration, ThreadName);
return 0;
}

int main()
{
//at the begining nothing is initialized
FirstThreadToFinish="Uninitialized";
IsInitialized=false;
cout<< "FirstThreadToFinish= "<<FirstThreadToFinish << ", IsInitalized="<<IsInitialized<<endl;

cout<<"Now launching 3 threads= "<<endl;
thread MyAThread(MyThreadFunction,1,"AThread");
thread MyBThread(MyThreadFunction,2,"BThread");
thread MyCThread(MyThreadFunction,3,"CThread");


MyAThread.join();
MyBThread.join();
MyCThread.join();

return 0;
}

希望对你有帮助,如果没有回答问题请随时告诉我

关于c++ - Thread c++ 防止值改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5779161/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com