이 같은 뮤텍스를 확보하기에 pthread_mutex_lock를 호출하는 것입니다 :이 작업을 수행 한 후에는이 스레드에서 pthread_mutex_unlock
를 호출 할 때까지, pthread_mutex_lock(mutex)
에 대한 다른 호출이 반환하지 않습니다
pthread_mutex_lock(&mutex);
. 따라서 pthread_create를 호출하려고하면 새 스레드를 만들 수 있고 해당 스레드는 (잘못) 공유 리소스를 사용할 수 있습니다. fooAPI
함수에서 pthread_mutex_lock
으로 전화하면 공유 자원을 사용할 수있을 때까지 함수가 대기하게됩니다.
#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_PROCESS_SHARED 속성을 가져야한다는 것을 잊어 버리십시오. 그러면 pthread가 프로세스에서 작동합니다.
이 매우 분명하다. 또한 다른 응용 프로그램 인 프로세스 B가 sharedResource에 액세스 할 수있는 방법의 예를 포함시킬 수 있습니까? – resting