programing

뮤텍스 잠금 스레드

bestprogram 2023. 7. 26. 22:15

뮤텍스 잠금 스레드

멀티 스레드/프로세스 프로그래밍을 처음 사용합니다.그래서 여기 제가 분명히 해야 할 것이 있습니다.

프로세스 A 코드

pthread_mutex_lock()
    pthread_create(fooAPI(sharedResource)) //fooAPI creates another thread with shared resource that shares across processes.
pthread_mutex_unlock()

위의 의사 코드를 사용하여 프로세스 B가 액세스할 수 있습니까?sharedResource뮤텍스가 잠금 해제되지 않은 경우?

프로세스 B에서 공유 리소스에 올바르게 액세스하려면 어떻게 해야 합니까?

뮤텍스, 스레드 및 프로세스 간의 관계를 설명하는 명확한 시각적 다이어그램이 있습니까?

다음과 같이 pthread_mutex_lock을 호출하여 뮤텍스를 보호해야 합니다.

pthread_mutex_lock(&mutex);

이 작업을 수행하면 다른 모든 전화가pthread_mutex_lock(mutex)당신이 전화할 때까지 돌아오지 않을 것입니다.pthread_mutex_unlock이 실에따라서 pthread_create를 호출하려고 하면 새 스레드를 생성할 수 있으며 해당 스레드는 공유 리소스를 (잘못) 사용할 수 있습니다.전화해 보세요pthread_mutex_lock당신 내부에서fooAPI기능을 사용하면 공유 리소스를 사용할 수 있을 때까지 기능이 대기하게 됩니다.

그래서 당신은 다음과 같은 것을 갖게 될 것입니다.

#include <pthread.h>
#include <stdio.h>

int sharedResource = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* fooAPI(void* param)
{
    pthread_mutex_lock(&mutex);
    printf("Changing the shared resource now.\n");
    sharedResource = 42;
    pthread_mutex_unlock(&mutex);
    return 0;
}

int main()
{
    pthread_t thread;

    // Really not locking for any reason other than to make the point.
    pthread_mutex_lock(&mutex);
    pthread_create(&thread, NULL, fooAPI, NULL);
    sleep(1);
    pthread_mutex_unlock(&mutex);

    // Now we need to lock to use the shared resource.
    pthread_mutex_lock(&mutex);
    printf("%d\n", sharedResource);
    pthread_mutex_unlock(&mutex);
}

편집: 프로세스 간에 리소스를 사용하는 것은 이와 동일한 기본 접근 방식을 따르지만 메모리를 다른 프로세스에 매핑해야 합니다.다음은 shmem을 사용한 예입니다.

#include <stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>

struct shared {
    pthread_mutex_t mutex;
    int sharedResource;
};

int main()
{
    int fd = shm_open("/foo", O_CREAT | O_TRUNC | O_RDWR, 0600);
    ftruncate(fd, sizeof(struct shared));

    struct shared *p = (struct shared*)mmap(0, sizeof(struct shared),
        PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    p->sharedResource = 0;

    // Make sure it can be shared across processes
    pthread_mutexattr_t shared;
    pthread_mutexattr_init(&shared);
    pthread_mutexattr_setpshared(&shared, PTHREAD_PROCESS_SHARED);

    pthread_mutex_init(&(p->mutex), &shared);

    int i;
    for (i = 0; i < 100; i++) {
        pthread_mutex_lock(&(p->mutex));
        printf("%d\n", p->sharedResource);
        pthread_mutex_unlock(&(p->mutex));
        sleep(1);
    }

    munmap(p, sizeof(struct shared*));
    shm_unlink("/foo");
}

p->sharedResource를 변경하기 위한 프로그램을 작성하는 것은 독자를 위한 연습으로 남습니다. :-)

참고로 pthread가 프로세스 간에 작동하려면 뮤텍스에 PTHREAD_PROCESS_SHARED 속성이 설정되어 있어야 한다는 것을 잊었습니다.

Q1.) 프로세스 B가 프로세스 A에서 잠근 것과 동일한 뮤텍스의 소유권을 얻으려고 한다고 가정하면(의사 코드에서 제외됨) 아니요, 프로세스 B는 프로세스 A에 의해 해제될 때까지 뮤텍스가 잠길 때까지 대기하기 때문에 프로세스 B가 공유 리소스에 액세스할 수 없습니다.뮤텍스가 잠겼을 때(또는 오류가 발생했을 때) mutex_lock() 기능에서 반환됩니다.

Q2.) 프로세스 B에서 항상 뮤텍스를 잠그고 공유 리소스에 액세스한 다음 뮤텍스의 잠금을 해제합니다.또한 mutex_lock(pMutex) 루틴의 반환 코드를 확인하여 실제로 mutex를 소유하고 있는지 확인하고 mutex를 잠근 경우에만 잠금을 해제합니다.프로세스 A에서도 동일한 작업을 수행합니다.

두 프로세스 모두 뮤텍스에 액세스할 때 기본적으로 동일한 작업을 수행해야 합니다.
lock() 잠금이 성공하면 {access sharedResource unlock()}

Q3.) 네, 많은 도표가 있습니다: =) https://www.google.se/search?q=mutex+thread+process&rlz=1C1AFAB_enSE487SE487&um=1&ie=UTF-8&hl=en&tbm=isch&source=og&sa=N&tab=wi&ei=ErodUcSmKqf54QS6nYDoAw&biw=1200&bih=1730&sei=FbodUbPbB6mF4ATarIBQ

공정은 하나 이상의 스레드로 구성됩니다(주함수를 생각해 보십시오).다중 스레드 코드는 더 많은 스레드를 생성할 뿐입니다.음소거는 데이터 손상/예상치 못한/원치 않은 동작을 방지하기 위해 공유 리소스 주변에 잠금을 만드는 데 사용됩니다.기본적으로 비동기 설정에서 순차적 실행을 제공합니다. 이 요구 사항은 공유 데이터 구조에 대한 비연속적인 비원자적 작업에서 비롯됩니다.

사람들(나사)이 화장실(공유 리소스)을 방문하기 위해 줄을 서는 경우에 대해 뮤텍스가 무엇인지 생생하게 설명합니다.한 사람(나사)이 화장실을 사용하는 동안(비연속 비원자 작동) 도어가 잠겼는지(뮤텍스) 확인해야 합니다. 그렇지 않으면 완전 몽티(불필요한 행동)에 걸릴 수 있습니다.

아래 코드 스니펫은 뮤텍스-락-락-락 개념을 이해하는 데 도움이 될 것입니다.코드에서 모의 실행을 시도합니다. (대기 시간과 프로세스 시간을 변경하면 이해력을 높일 수 있습니다.)

참조용 코드:

#include <stdio.h>
#include <pthread.h>

void in_progress_feedback(int);

int global = 0;
pthread_mutex_t mutex;
void *compute(void *arg) {

    pthread_t ptid = pthread_self();
    printf("ptid : %08x \n", (int)ptid);    

    int i;
    int lock_ret = 1;   
    do{

        lock_ret = pthread_mutex_trylock(&mutex);
        if(lock_ret){
            printf("lock failed(%08x :: %d)..attempt again after 2secs..\n", (int)ptid,  lock_ret);
            sleep(2);  //wait time here..
        }else{  //ret =0 is successful lock
            printf("lock success(%08x :: %d)..\n", (int)ptid, lock_ret);
            break;
        }

    } while(lock_ret);

        for (i = 0; i < 10*10 ; i++) 
        global++;

    //do some stuff here
    in_progress_feedback(10);  //processing-time here..

    lock_ret = pthread_mutex_unlock(&mutex);
    printf("unlocked(%08x :: %d)..!\n", (int)ptid, lock_ret);

     return NULL;
}

void in_progress_feedback(int prog_delay){

    int i=0;
    for(;i<prog_delay;i++){
    printf(". ");
    sleep(1);
    fflush(stdout);
    }

    printf("\n");
    fflush(stdout);
}

int main(void)
{
    pthread_t tid0,tid1;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&tid0, NULL, compute, NULL);
    pthread_create(&tid1, NULL, compute, NULL);
    pthread_join(tid0, NULL);
    pthread_join(tid1, NULL);
    printf("global = %d\n", global);
    pthread_mutex_destroy(&mutex);
          return 0;
}

언급URL : https://stackoverflow.com/questions/14888027/mutex-lock-threads