Not all access operations are conflicting, however.
Thread 1 on Thread 2 on
Memory CPU 1 CPU 2
============== =================== =================
N = 1234
Read N --> 1234
Add 1 --> 1235 Read N --> 1234
N = 1235 Write N
Add 1 --> 1235
N = 1235 Write N
|
#include <pthread.h>
int N; <========= Shard variable N
pthread_t tid[100];
// Each thread executes the following function:
void *worker(void *arg)
{
int i, k, s;
for (i = 0; i < 10000; i = i + 1)
{
N = N + 1; <======= Multiple threads access shared variable N
}
cout << "Added 10000 to N" << endl;
return(NULL); /* Thread exits (dies) */
}
/* =======================
MAIN
======================= */
int main(int argc, char *argv[])
{
int i, num_threads;
num_threads = atoi(argv[1]);
/* ------
Create threads
------ */
for (i = 0; i < num_threads; i = i + 1)
{
if ( pthread_create(&tid[i], NULL, worker, NULL) )
{
cout << "Cannot create thread" << endl;
exit(1);
}
}
N = 0;
// Wait for all threads to terminate
for (i = 0; i < num_threads; i = i + 1)
pthread_join(tid[i], NULL);
cout << "N = " << N << endl << endl;
exit(0);
}
|
How to run the program:
|
|
|
|
|