// Type your code here, or load an example.
#include <iostream>
#include <numeric>
#include <string>
#include <mutex>
#include <thread>
template <class T>
class SharedVariable {
private:
std::mutex mtx;
T data;
public:
T Get(void) {
T data_cpy;
std::lock_guard<std::mutex> lck(mtx);
data_cpy = this->data;
return data_cpy;
}
void Set(const T data) {
std::lock_guard<std::mutex> lck(mtx);
this->data = data;
}
};
void func(int & i ,std::mutex & mtx) {
std::lock_guard<std::mutex> lck(mtx);
int tmp = i;
std::this_thread::yield();
i = tmp +1 ;
}
void func2(SharedVariable<int> & sv_int) {
int tmp = sv_int.Get();
std::this_thread::yield();
sv_int.Set(tmp +1);
}
#define TH_NUM 8
void func_test(){
int x = 0 ;
std::mutex mtx ;
bool strt_flag = false;
std::thread t [TH_NUM];
for (size_t i = 0 ;i < TH_NUM;++i) {
t[i] = std::thread([&]() {
while(!strt_flag);
func(x , mtx);
});
}
strt_flag = true;
for (int i = 0 ;i<TH_NUM ;++i) {
t[i].join();
}
std::cout<<"x = "<< x <<std::endl;
}
void func2_test(){
SharedVariable<int> sv_int;
sv_int.Set(0);
std::thread t [TH_NUM];
bool strt_flag = false;
for (size_t i = 0 ;i < TH_NUM;++i) {
t[i] = std::thread([&]() {
while(!strt_flag);
func2(sv_int);
});
}
strt_flag = true;
for (size_t i = 0 ;i < TH_NUM;++i) {
t[i].join();
}
std::cout<<"sv_int = "<< sv_int.Get() <<std::endl;
}
int main () {
func_test();
func2_test();
return 0;
}
Ly8gVHlwZSB5b3VyIGNvZGUgaGVyZSwgb3IgbG9hZCBhbiBleGFtcGxlLgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bXV0ZXg+CiNpbmNsdWRlIDx0aHJlYWQ+Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgICBTaGFyZWRWYXJpYWJsZSB7CnByaXZhdGU6CiAgICBzdGQ6Om11dGV4ICBtdHg7CiAgICBUICAgICAgICAgICBkYXRhOwpwdWJsaWM6CiAgICBUICAgR2V0KHZvaWQpIHsKICAgICAgICBUICAgICAgIGRhdGFfY3B5OwogICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsY2sobXR4KTsKICAgICAgICBkYXRhX2NweSA9IHRoaXMtPmRhdGE7CiAgICAgICAgcmV0dXJuIGRhdGFfY3B5OwogICAgfQogICAgdm9pZCBTZXQoY29uc3QgVCBkYXRhKSB7CiAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxjayhtdHgpOwogICAgICAgIHRoaXMtPmRhdGEgPSBkYXRhOwogICAgfQp9OyAgICAKCnZvaWQgZnVuYyhpbnQgJiBpICxzdGQ6Om11dGV4ICYgbXR4KSB7CiAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGNrKG10eCk7CiAgICBpbnQgdG1wID0gaTsKICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CiAgICBpID0gdG1wICsxIDsKfQoKdm9pZCBmdW5jMihTaGFyZWRWYXJpYWJsZTxpbnQ+ICYgc3ZfaW50KSB7CiAgICBpbnQgdG1wID0gc3ZfaW50LkdldCgpOwogICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKICAgIHN2X2ludC5TZXQodG1wICsxKTsKfQoKI2RlZmluZSBUSF9OVU0gOAoKdm9pZCBmdW5jX3Rlc3QoKXsKICAgIGludCB4ID0gMCA7CglzdGQ6Om11dGV4IG10eCA7Cglib29sIHN0cnRfZmxhZyA9IGZhbHNlOwoJc3RkOjp0aHJlYWQgdCBbVEhfTlVNXTsKICAgIGZvciAoc2l6ZV90IGkgPSAwIDtpIDwgVEhfTlVNOysraSkgeyAKICAgICAgICB0W2ldID0gc3RkOjp0aHJlYWQoWyZdKCkgewogICAgICAgICAgICB3aGlsZSghc3RydF9mbGFnKTsKICAgICAgICAgICAgZnVuYyh4ICwgbXR4KTsKICAgICAgICB9KTsKCiAgICB9CiAgICBzdHJ0X2ZsYWcgPSB0cnVlOwogICAgZm9yIChpbnQgaSA9IDAgO2k8VEhfTlVNIDsrK2kpIHsKICAgIAkKICAgIAl0W2ldLmpvaW4oKTsKICAgIAkKICAgIH0gCiAgICBzdGQ6OmNvdXQ8PCJ4ID0gIjw8IHggPDxzdGQ6OmVuZGw7Cn0KCnZvaWQgZnVuYzJfdGVzdCgpewogICAgU2hhcmVkVmFyaWFibGU8aW50PiBzdl9pbnQ7CiAgICBzdl9pbnQuU2V0KDApOwogICAgc3RkOjp0aHJlYWQgdCBbVEhfTlVNXTsKICAgIGJvb2wgc3RydF9mbGFnID0gZmFsc2U7CiAgICBmb3IgKHNpemVfdCBpID0gMCA7aSA8IFRIX05VTTsrK2kpIHsgCiAgICAgICAgdFtpXSA9IHN0ZDo6dGhyZWFkKFsmXSgpIHsKICAgICAgICAgICAgd2hpbGUoIXN0cnRfZmxhZyk7CiAgICAgICAgICAgIGZ1bmMyKHN2X2ludCk7CiAgICAgICAgfSk7CiAgICB9CiAgICBzdHJ0X2ZsYWcgPSB0cnVlOwogICAgZm9yIChzaXplX3QgaSA9IDAgO2kgPCBUSF9OVU07KytpKSB7IAogICAgICAgIHRbaV0uam9pbigpOwogICAgfQogICAgc3RkOjpjb3V0PDwic3ZfaW50ID0gIjw8IHN2X2ludC5HZXQoKSA8PHN0ZDo6ZW5kbDsKfQoKCmludCBtYWluICgpIHsKICAgIGZ1bmNfdGVzdCgpOwogICAgZnVuYzJfdGVzdCgpOwoKICAgIHJldHVybiAwOwp9