[pthread] Spinlock

      Comments Off on [pthread] Spinlock

https://www.bogotobogo.com/cplusplus/multithreading_pthread.php

Nhanh chóng chiếm được lock as soon as lock được nhả ra. Tiến trình đợi không ngủ liên tục chờ đợi. Nên dùng spinlock với trường hợp cần nhanh chóng lấy được lock, thời gian chờ lock là nhỏ ( critical area là nhỏ)

Ví dụ:

#define HAVE_STRUCT_TIMESPEC
#include <stdio.h>
#include "pthread.h"
/*
	spinlock không dùng với pthread_cond_t lý do 
	https://stackoverflow.com/questions/19939363/pthreads-condition-variable-with-spinlock
*/


pthread_spinlock_t spin1;
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
void * funcC1(void * data);
void * funcC2(void * data);
int count = 0;
#define COUNT_DONE 10
#define COUNT_HALT1 3
#define COUNT_HALT2 6
int main(int argc, char * argv[])
{
	pthread_t tid1, tid2;
	pthread_spin_init(&spin1, PTHREAD_PROCESS_PRIVATE);
	pthread_create(&tid1, NULL, &funcC1, NULL);
	pthread_create(&tid2, NULL, &funcC2, NULL);

	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);

	printf("Gia tri counter cuoi cung: %d\n", count);

	return 0;
}
//Viết các số từ 1-3 và 8-10 bởi thủ tục funcC1()
void * funcC1(void * data)
{
	for (;;)
	{
		//Khóa mutex và đợi tín hiệu để giải phóng mutex
		pthread_spin_lock(&spin1);
		count++;
		printf("Gia tri counter cua funcC1: %d\n", count);
		pthread_spin_unlock(&spin1);
		if (count >= COUNT_DONE) return(NULL);
	}
}
//Viết các số từ 4-7 bởi thủ tục funcC2()
void * funcC2(void * data)
{
	for (;;)
	{
		pthread_spin_lock(&spin1);
		if (count < COUNT_HALT1 || count > COUNT_HALT2)
		{
		}
		else
		{
			count++;
			printf("Gia tri counter cua funcC2: %d\n", count);
		}
		pthread_spin_unlock(&spin1);
		if (count >= COUNT_DONE) return(NULL);
	}
}