Ekran-Alıntısı

Thread & Multithreading

Thread en basit haliyle programın “birbirinden bağımsız ve paralel olarak işlemler yapması” olarak tanımlanabilir. Bu yazımda multithreadinge basit bir örnek vereceğim. Yani işlemcim aynı process içinde farklı threadleri destekler nitelikte olacak.

Vereceğim kodun yapması gereken iş iki thread oluşturarak, verilen input dosyasındaki sayıları tek tek okuyarak toplamını yazdırmaktır. Ancak oluşturulan threadlerden birinin bu işlemi dosyanın başından ortasına doğru yaparken, ötekinin sonundan ortasına dek yapması gerekmektedir. Dosya ortasına geldiklerinde ise toplamı ekrana yazdıracaklardır.

“input.txt” dosyasında 10 değer olduğunu ve bu değerlerin;

1.23
2.66
3.45
8.41
9.11
3.33
7.78
4.12
1.11
2.22

olduğunu varsayalım.

#include
#include #include

using namespace std;

float sum1 = 0;
float sum2 = 0;

void readAddBegin();
void readAddEnd();

int main() {

thread t1(readAddBegin); //t1 starts running
thread t2(readAddEnd); //t2 starts running

//synchronize threads
t2.join(); //main thread waits for t2 to finish
t1.join(); //main thread waits for t1 to finish

cout << “The sum is: ” << (sum1 + sum2);

return 0;
}

void readAddBegin() {

fstream values(“input.txt”); //read file

float value1[10];
int order = 1;

for (int i = 0; i > value1[i]; //get next value from file
sum1 += value1[i];

cout << “Thread1 reads ” << order << ” . value from beginning. ” <<
“The value is: ” << value1[i] << “. The sum is: ” << sum1 << endl;
order++;

}//end of for

values.close();
}

void readAddEnd() {

float value2[10];

int order = 1;

fstream values(“input.txt”);

for (int i = 0; i > value2[i]; //get next value from file

}

for (int i = 9; i >= 5; i–) {

sum2 += value2[i];
cout << “Thread2 reads ” << order << ” . value from end. ” <<
“The value is: ” << value2[i] << “. The sum is: ” << sum2 << endl;
order++;

}//end of for

values.close();

}

thread t1 ile t1 thread’imi oluşturarak çalışmasını istediğim işlemi, yani fonksiyonu bu threadin içine veriyorum. threadlerin birbirini beklemesi yani senkronize bir şekilde çalışmasını sağlamak içinse t1.join(), t2() fonksiyonlarını kullanıyorum.

Ben dosyadaki değerleri sondan başa okumaya üşendiğim için değerleri bir arraye atarak azıcık C bilen bir kişinin bile düşünebileceği bir şekilde okudum.

Kodu visual studio ortamında geliştirdim, derlerken ve çalıştırırken bir problemle karşılaşmadım.

Ancak ubuntuda .cpp uzantılı derlemek için “g++ -o dosyaadı dosyaadı.uzantı” veya .c derlemek için “gcc dosyaadı.c” komutları işe yaramadı ben de şöyle bir komut öğrendim(şaşkınım!) “g++ dosyaadı.cpp -std=c++0x -pthread -o a” sonrasında oluşan a.out dosyasını çalıştırmak içinse ./a yapıyoruz ki zaten biliyorsunuzdur.

Umarım yazım ilerde karşılaşacağınız sorunlara yardımcı olur. Tekrar görüşmek üzere, hoşçakalın. Bu arada global değişken oluşturacak kadar çaresiz miydin derseniz, hayır değildim ama yaptım. Yine olsa yine yaparım.

Bir Cevap Yazın