आप क्या करने की जरूरत एक म्युटेक्स सुरक्षित करने के लिए, इस तरह pthread_mutex_lock कॉल करने के लिए है:
pthread_mutex_lock(&mutex);
एक बार जब आप ऐसा करते हैं, pthread_mutex_lock(mutex)
के लिए किसी भी अन्य कॉल वापस नहीं होगा, जब तक आप इस थ्रेड के pthread_mutex_unlock
कहते हैं। तो यदि आप 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 पाठक के लिए एक व्यायाम के रूप में छोड़ दिया जाता है। :-)
ध्यान दें कि, mutex को PTHREAD_PROCESS_SHARED विशेषता सेट होना चाहिए, ताकि pthreads प्रक्रियाओं में काम करे।
यह बहुत स्पष्ट है। क्या आप एक उदाहरण भी शामिल कर सकते हैं कि प्रोसेस बी जो एक और एप्लीकेशन है, साझा संसाधन को एक्सेस कर सकता है? – resting