22
Mayıs
2010

C’de ve POSIX ile Multithreading

Bu sene Doç. Dr. Aylin Kantarcı hocamızın verdiği İşletim Sistemleri 2 dersinde, süreç (process) ve iş parçacıklarının (thread) neler olduklarını ve nasıl işlediklerini ayrıntılı bir şekilde öğrendik. Bize verilen ikinci ödevde, iki matrisin çarpma işleminin her satırını bir iş parçacığına yaptıracağımız bir program istendi.

Ödevde, yaratılan bir thread çalışmaya başlamadan önce diğer tüm threadlerin yaratılmasını beklemeliydi. Biz de bu ödevi POSIX kütüphanesi ile hayata geçirdik.

POSIX: Linuxgiller. Onun için aşağıdaki kod Windows’ta çalışmaz.

Kaynak kodlarında mutex kullanımına örnek bulabilirsiniz. Kaynak kodlarını, ödev metnini ve ödev raporunu aşağıdan indirebilirsiniz. Kaynak kodu indirmek istemezseniz yazının devamına göz atabilirsiniz.

Dipnot: Kaynak kodları eğitim amaçlı olup, acemisi olduğum bir konu üzerinde yazılmış olduğundan bu kodları geliştirip Max Payne 3 yazarsanız ve yazdığınız oyun çökerse beni suçlayıp topuğuma sıkamayacağınızı bilmenizi isterim.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
 
/* Mutex ve cond değişkenleri */
pthread_mutex_t condition_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  condition_cond  = PTHREAD_COND_INITIALIZER;
 
pthread_mutex_t creating_theads_mutex = PTHREAD_MUTEX_INITIALIZER;
int creating_theads = 0;
 
int *sharedMatrisA;
int *sharedMatrisB;
int *sharedMatrisC;
int m;
int n;
int k;
 
void *matrisHesapla(int satirno) {
 
    printf("Thread #%d init.\n",satirno+1);
    fflush(stdout);
 
    /* Hala thread yaratma asamasindaysak bekle. */
    if(creating_theads > 0) {
        printf("Thread #%d digerlerinin yaratilmasini beklemek uzere kitlenecek.\n",satirno+1);
        fflush(stdout);
        /* Yaratılınca bir bekle önce. */
        pthread_mutex_lock( &condition_mutex );
        printf("Thread #%d mutex locked.\n",satirno+1);
        fflush(stdout);
        pthread_cond_wait( &condition_cond, &condition_mutex );
        printf("Thread #%d cond wait ended.\n",satirno+1);
        fflush(stdout);
        pthread_mutex_unlock( &condition_mutex );
 
        printf("Thread #%d calismaya devam ediyor.\n",satirno+1);
        fflush(stdout);
    } else {
        pthread_mutex_unlock(&creating_theads_mutex);
        printf("Thread #%d beklemeye fırsat bulamadan tüm threadler yaratılmış.\n",satirno+1);
        fflush(stdout);
    }
 
    printf("Thread #%d hesaplamaya basladi.\n",satirno+1);
    int ic1,ic2;
    for(ic1=0; ic1<k; ic1++) {
        for(ic2=0; ic2<n; ic2++)  {
            /* Her thread kendi satırına yazdıgı için problem olmaz, mutexe gerek yok. */
            sharedMatrisC[(satirno*k) + ic1] += sharedMatrisA[(satirno*n) + ic2] * sharedMatrisB[(ic2*k)+ic1];
        }
    }
    printf("Thread #%d hesaplamayi bitirdi ve sonlandi.\n",satirno+1);
 }
 
int main() {
 
    /* Acilis yazilari BASLANGICI */
    printf("Umut BENZER\n");
    printf("05-06-7670\n");
    printf("Ege Universitesi Bilgisayar Muhendisligi 3. Sinif\n");
    printf("http://www.ubenzer.com\n");
    printf("Threads\n\n");
    /* Acilis yazilari SONU */
 
    FILE *fp;
    if((fp=fopen("input.txt","r")) == NULL) {
        printf ("Dosya acilamadi.");
        exit(-1);
    }
 
    fscanf(fp,"%d %d %d",&m, &n, &k);
 
    int matrisA[m][n];
    int matrisB[n][k];
    int matrisC[m][k];
    sharedMatrisA = &matrisA;
    sharedMatrisB = &matrisB;
    sharedMatrisC = &matrisC;
 
    int i;
    int j;
 
    for(i=0;i<m;i++) {
         for(j=0;j<k;j++) {
            matrisC[i][j] = 0;
        }
    }
 
    /* A MATRISINI OKU */
    for(i=0;i<m;i++) {
        for(j=0;j<n;j++) {
            fscanf(fp,"%d",&matrisA[i][j]);
        }
    }
 
    /* B MATRISINI OKU */
    for(i=0;i<n;i++) {
        for(j=0;j<k;j++) {
            fscanf(fp,"%d",&matrisB[i][j]);
        }
    }
 
    fclose(fp);
 
    /* EKRANA MATRISLERI YAZDIR */
    printf("Matris A:\n");
    for(i=0;i<m;i++) {
        for(j=0;j<n;j++) {
            printf("%d\t", matrisA[i][j]);
        }
        printf("\n");
    }
 
    printf("\nMatris B:\n");
    for(i=0;i<n;i++) {
        for(j=0;j<k;j++) {
            printf("%d\t", matrisB[i][j]);
        }
        printf("\n");
    }
 
    printf("\n");
    pthread_t threads[m];
    fflush(stdout);
 
 
    creating_theads = 1;
    printf("Threadler yaratılıyor...\n");
    fflush(stdout);
    for(i=0;i<m;i++) {
        printf("Thread #%d/%d yaratıldı.\n",i+1,m);
        fflush(stdout);
        pthread_create(&threads[i], NULL, &matrisHesapla, i);
    }
 
    pthread_mutex_lock(&creating_theads_mutex);
    creating_theads = 0;
    pthread_mutex_unlock(&creating_theads_mutex);
 
    printf("Thread yaratimi tamamlamdi. Simdi beklemelerin bitmesi icin mesaj gonderilecek.\n");
    fflush(stdout);
 
    /* Threadler çalışabilirler */
    pthread_mutex_lock( &condition_mutex );
    pthread_cond_broadcast( &condition_cond );
    pthread_mutex_unlock( &condition_mutex );
 
    printf("Beklemekte olabilecek threadlere isleme baslamasini soyleyen mesaj gonderildi.\n");
 
    fflush(stdout);
    for(i=0;i<m;i++) {
        printf("Main thread #%d/%d'nin bitmesini bekliyor...\n",i+1,m);
        pthread_join(threads[i],NULL);
    }
 
    printf("\nMatris C:\n");
    for(i=0;i<m;i++) {
        for(j=0;j<k;j++) {
            printf("%d\t", matrisC[i][j]);
        }
        printf("\n");
    }
 
    printf("\n");
    printf("...ve bize ayrilan surenin sonuna geldik...\n");
    printf("...bir sonraki odevde gorusmek uzere, esen kalin efendim...\n");
    exit(0);
 
}
bu yazı 1.057 defa okundu

Site hoşunuza gitti mi? Belki arkadaşlarınızın da gider.

İstekli

Aaa Reklam

Yorumunuzu Bırakın

Bu yazıya gönderilen yeni yorumları e-posta aracılığıyla bana bildir
Yeni gönderilenleri yorum yapmadan takip etmek için tıklayınız.

Yorumunuz başarıyla alındı. Onaylandıktan sonra yayımlanacaktır. Teşekkürler.

Twitler yükleniyor... 5 saniye sonra

Bıdı bıdı bıdı bıdı dıdı dıdı dudu dudu hıdı hıdı hödü hödü yüklüyoruz öhüm öhüm bıdı bıdı vs vs... 6 nanosaniye önce

Yüklenmenin geç olmasının sebebi ben değilim, Twitter API'sinin yavaş olması. Gudu gudu hıdı hödö büdü büdü... 25697 asır önce

Ha tabi bunları okumuşsan, bu sitenin çok gizli bir özelliğini bulmuşsun demektir. ;) Tebrikler. Bu "sürpiz yumurta"yı bulduğunu bana da haber verir misin? Tıkla! 6 dinazor önce

Geçen Yıllarda Bu Hafta

2011

Bunun Burada Ne İşi Var?

Bunun Burada Ne İşi Var?

Dün şehre inmek için Sayın Menderes Türel’in zamanında Hafif Metro ...

Windows 7’de Bilgisayarınızın Aldığı Puanı Değiştirin

Windows 7’de Bilgisayarınızın Aldığı Puanı Değiştirin

Biliyorsunuz Microsoft, Windows Vista’dan bu yana bilgisayarlar için bir performans ...

Dördüncü Sınıfın Birinci Döneminden Öğrenci Görüşleri

Dördüncü Sınıfın Birinci Döneminden Öğrenci Görüşleri

Dördüncü sınıfın yarısı bitti. Okuldan mezun olmak üzereyim. İyisiyle kötüsüyle bir ...

UBenzer’den Alın!

UBenzer’den Alın!

Ablam evdeki kullanılmayanları ayırmış, “Umut bunları sat.” dedi. Hazır elime ...

2009

Kısık Işık

Kısık Işık

Tavana asılmış tek beyaz floresan lambayı sevemedim bir türlü… “Ben ...

Antalya Toplu Taşıma Sisteminin Sorunları - 1

Antalya Toplu Taşıma Sisteminin Sorunları - 1

Antalya’da ulaşım bir ölüm. Trafik sıkışıklığı, haftada bir yönü değişen ...

2008

14 Şubat

14 Şubat

Biliyorsun bugün 14 Şubat. Daha iki gün öncesinden hazırdı zaten ...

Uyumadan Önce Son Boşluk

Uyumadan Önce Son Boşluk

Uykuya dalmadan önce düşünürüm… Kötü alışkanlıklarımdan biridir. Aklıma ne gelirse ......

NES Emulatörleri

NES Emulatörleri

Daha önceki şu iki yazımda (1.si, 2.si), çocukken bolca oynadığımız ...

Son Yorumlar