sincronización de subprocesos de programación del entorno linux [bloqueo de lectura-escritura]

1. Bloqueo de lectura y escritura

Similar a los mutex introducidos anteriormente, pero los bloqueos de lectura y escritura tienen un mayor paralelismo.

 

2. El estado del bloqueo de lectura y escritura

1. Bloqueo de lectura [bloqueo en modo lectura]

2. Bloqueo de escritura [bloqueo en modo de escritura]

3. Sin cerradura

 

3. Características del bloqueo de lectura y escritura

  • 1. Cuando el bloqueo de lectura y escritura es "bloqueo de modo de escritura", todos los subprocesos que bloquean el bloqueo se bloquearán antes de desbloquearse.
  • 2. Cuando el bloqueo de lectura-escritura está "bloqueado en modo lectura", si el hilo lo bloquea en modo lectura, tendrá éxito, si el hilo se bloquea en modo escritura, se bloqueará.
  • 3. Cuando el bloqueo de lectura-escritura es "bloquear en modo lectura", hay subprocesos que intentan bloquearse en modo escritura y hay subprocesos que intentan bloquearse en modo lectura. Bloqueo de lectura y escritura

Bloqueará las solicitudes de bloqueo del modo de lectura posteriores. Primero, cumpla con el bloqueo del modo de escritura. Los bloqueos de lectura y escritura bloquean en paralelo, y los bloqueos de escritura con bloqueos de lectura y escritura de alta prioridad también se denominan bloqueos exclusivos compartidos. Cuando el bloqueo de lectura-escritura está bloqueado en modo lectura, está bloqueado en modo compartido, y cuando está bloqueado en modo escritura, está bloqueado en modo exclusivo. El bloqueo de lectura y escritura es muy adecuado para situaciones en las que el número de lecturas de la estructura de datos es mucho mayor que el de escrituras.
 

Cuatro. Principales funciones de la aplicación

pthread_rwlock init, función
pthread_rwlock_destroy función
pthread_rwlock_rdlock función
pthread_rwlock_wrlock, función
pthread_rwlock_tryrdlock, función
pthread_rwlock_trywrlock función
pthread_rwlock_unlock

función Los valores devueltos directamente por las 7 funciones de error anteriores son: éxito devuelve 0,.
El tipo pthread_rwlock_t usa un sub para definir una variable de bloqueo de lectura-escritura.
pthread_rwlock_t rwlock;
 

Cinco. El principio del bloqueo de lectura y escritura

Demostración de Six. Code

#include <iostream>
#include <pthread.h>
#include <string.h>
#include <unistd.h>

using namespace std;

#define THREAD_NUM 8

pthread_rwlock_t rwlock;
int n=0;

void*
thread_func_read(void* arg)
{
	int *index = (int*)arg;
	int i=4;
	while(i--){
		pthread_rwlock_rdlock(&rwlock);
		printf("I am the %dth son thread ID:%lu \n", *index, pthread_self());
		printf("the value of n is %d \n", n);   // 对n读模式
		pthread_rwlock_unlock(&rwlock);
		usleep(100);
	}
	delete index;
}

void*
thread_func_write(void* arg)
{
	int *index = (int*)arg;
	int i=4;
	while(i--){
		pthread_rwlock_wrlock(&rwlock);
		printf("I am the %dth son thread ID:%lu \n", *index, pthread_self());
		n++;  // 写模式
		printf("the value of n is %d \n", n);
		pthread_rwlock_unlock(&rwlock);
		usleep(100);
	}
	delete index;
}

int
main(int argc, char*argv[])
{
	pthread_t tid[THREAD_NUM];
	pthread_attr_t attr;
	int err, i, *value;

	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr,  PTHREAD_CREATE_JOINABLE);

	pthread_rwlock_init(&rwlock, NULL);

	for(i=0; i<THREAD_NUM/2; i++){
		value = new int(i+1);
		if( (err = pthread_create(&tid[i], &attr, thread_func_read, (void*)value)) != 0){
			fprintf(stderr, "%dth thread create error the reason is %s \n", *value, strerror(err));
			delete value;
		}
	}

	for( ; i<THREAD_NUM; i++){
		value = new int(i+1);
		if( (err = pthread_create(&tid[i], &attr, thread_func_write, (void*)value)) != 0){
			fprintf(stderr, "%dth thread create error the reason is %s \n", *value, strerror(err));
			delete value;
		}
	}
	
	for(i=0; i<THREAD_NUM; i++){
		pthread_join(tid[i], NULL);
	}

	pthread_attr_destroy(&attr);
	pthread_rwlock_destroy(&rwlock);
	pthread_exit(NULL);
}

 

Supongo que te gusta

Origin blog.csdn.net/qq_44065088/article/details/109193609
Recomendado
Clasificación