Программа должна создать несколько потоков, где каждый поток увеличивает общую переменную на 10000, используя цикл for, который увеличивает ее на 1 в каждой итерации.Требуются обе версии: мьютекс-блокировка и спин-блокировка (ожидание занятости).Согласно тому, что я узнал, мьютексная версия должна работать быстрее, чем спин-блокировка.Но то, что я реализовал, дало мне противоположный ответ ...
Это дополнение каждого потока в версии мьютекса:
void *incr(void *tid)
{
int i;
for(i = 0; i < 10000; i++)
{
pthread_mutex_lock(&the_mutex); //Grab the lock
sharedVar++; //Increment the shared variable
pthread_mutex_unlock(&the_mutex); //Release the lock
}
pthread_exit(0);
}
И это реализация в версии спин-блокировки:
void *incr(void *tid)
{
int i;
for(i = 0; i < 10000; i++)
{
enter_region((int)tid); //Grab the lock
sharedVar++; //Increment the shared variable
leave_region((int)tid); //Release the lock
}
pthread_exit(0);
}
void enter_region(int tid)
{
interested[tid] = true; //Show this thread is interested
turn = tid; //Set flag
while(turn == tid && other_interested(tid)); //Busy waiting
}
bool other_interested(int tid) //interested[] is initialized to all false
{
int i;
for(i = 0; i < tNumber; i++)
if(i != tid)
if(interested[i] == true) //There are other threads that are interested
return true;
return false;
}
void leave_region(int tid)
{
interested[tid] = false; //Depart from critical region
}
Я также повторял процесс создания и запуска потоков в течение сотен раз, чтобы можно было различить время выполнения.Например, если tNumber равно 4, и я повторял программу 1000 раз, мьютекс займет у меня 2,22 секунды, а спин-блокировка - у меня 1,35 секунды.Разница увеличивается с увеличением tNumber.Почему это происходит?Мой код неверен?