আমি সাইগউইন জিসিসি ব্যবহার করছি এবং এই কোডটি চালাচ্ছি:
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
unsigned u = 0;
void foo()
{
u++;
}
int main()
{
vector<thread> threads;
for(int i = 0; i < 1000; i++) {
threads.push_back (thread (foo));
}
for (auto& t : threads) t.join();
cout << u << endl;
return 0;
}
লাইন দিয়ে সংকলিত: g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o
।
এটি 1000 মুদ্রণ করে, যা সঠিক। যাইহোক, থ্রেডগুলির কারণে পূর্বের বর্ধিত মানকে ওভাররাইটিংয়ের কারণে আমি কম সংখ্যার প্রত্যাশা করেছি। এই কোডটি পারস্পরিক অ্যাক্সেসে ভুগছে না কেন?
আমার পরীক্ষার মেশিনটিতে 4 টি কোর রয়েছে এবং আমি যে প্রোগ্রামটি জানি তার উপরে আমি কোনও বিধিনিষেধ রাখি না।
foo
আরও জটিল কিছু দিয়ে ভাগ করে নেওয়া সামগ্রীর প্রতিস্থাপন করার সময় সমস্যাটি থেকেই যায়
if (u % 3 == 0) {
u += 4;
} else {
u -= 1;
}
while true; do res=$(./a.out); if [[ $res != 1000 ]]; then echo $res; break; fi; done;
আমার সিস্টেমে 999 বা 998 প্রিন্ট করার মতো কিছু ।
u
মেমরি ফিরে লিখতে যান বলে। সিপিইউ আসলে আশ্চর্যজনক কাজগুলি করবে যে নোটিশের জন্য মেমরি লাইনটিu
সিপিইউ'র ক্যাশে নেই এবং এটি বর্ধিত ক্রিয়াকলাপ পুনরায় চালু করবে। এই কারণেই x86 থেকে অন্যান্য আর্কিটেকচারে যাওয়া চোখের খোলার অভিজ্ঞতা হতে পারে!