lock(), unlock(), query1(), query2() 및 query3() 함수가 있습니다. 쿼리 함수는 데이터베이스에서 일부 쿼리를 실행하고 r/w 액세스로 간주 할 수 있습니다. 그들은 잠그지 않는다. 내 시스템이 멀티 스레드입니다.데이터베이스 트랜잭션 및 스레드
원하는 기능은 다음과 같습니다. 스레드 p1에서 lock()이 호출되면 스레드 p1의 쿼리 만 실행되고 다른 모든 스레드의 쿼리는 잠금 해제를 기다립니다. 어떻게해야합니까?
저는 C에서 pthreads를 사용하고 있습니다. 이렇게하려면 스레드가 잠금을 보유하고 있음을 알아야합니다. 그러나 pthread에는 그러한 기능이 없습니다.
디자인이 잘못 되었습니까 ??
편집이 :
Function1(){
lock();
query1();
query2();
doQuery3();
unlock();
}
doQuery3(){
lock();
query3();
unlock();
}
잠금 내가 원하는 동작() 스레드가 이미 잠금을 보유하는 경우는 잠금을 기다릴해야한다는 것입니다. 그냥 실행해야합니다. 사실, lock() 함수는 실제로 트랜잭션을 시작합니다. 거래에서 여러 가지 물건을 실행하고 싶습니다. 그리고 unlock()은 트랜잭션을 종료합니다. 나는 질의를 연결할 수 있기를 원한다. 한 가지 해결 방법은 function1()에서 query3()을 doQuery3() 대신 호출하는 것입니다. 즉, 모든 함수에는 잠금 및 바닐라 쿼리가있는 두 가지 버전이 있습니다.
이 잠금 및 잠금 해제 함수는 뮤텍스 잠금이 아니거나 뮤텍스 잠금이 아닐 수도 있습니다. pthread 뮤텍스로 구현하려고 시도했지만 할 수 없습니다. 동일한 스레드에서 pthread_mutex_lock이 차단되기 때문에! 어떤 멋진 트릭 ??
더 잘 구현하는 방법을 알려면 더 많은 정보가 필요합니다. 이 잠금 전략으로 무엇을 달성하려고합니까? – Schwern
당신이 PTHREAD_MUTEX_RECURSIVE를 쓰면 스레드가 같은 잠금을 두 번 이상 획득 할 수 있다고 생각합니다. – ChrisW