मैं इस धारणा के तहत था कि flock(2) थ्रेड सुरक्षित है, मैंने हाल ही में कोड में मामले में भाग लिया है, जहां एकाधिक थ्रेड एक ही फ़ाइल पर लॉक प्राप्त करने में सक्षम हैं सभी सीपीआई झुंड का उपयोग कर विशेष ताला प्राप्त करने के उपयोग के साथ सिंक्रनाइज़। प्रक्रिया 25554 बहु-थ्रेडेड ऐप है जिसमें 20 थ्रेड हैं, उसी फ़ाइल में लॉक होने वाले धागे की संख्या भिन्न होती है जब डेडलॉक होता है। बहु थ्रेडेड ऐप testEvent फ़ाइल के लेखक हैं, जहां पुश फ़ाइल से पाठक था। दुर्भाग्यवश lsof
एलडब्लूपी मूल्य मुद्रित नहीं करता है, इसलिए मुझे नहीं पता कि लॉक रखने वाले थ्रेड कौन से हैं। जब नीचे उल्लिखित स्थिति होती है तो pstack
या strace
द्वारा 25569 और 25554 पर कॉल के रूप में प्रदर्शित की गई प्रक्रिया और थ्रेड दोनों फ्लॉक कॉल पर फंस गए हैं। RHEL 4.x में इसे कैसे दूर किया जाए इस पर कोई सुझाव।एक ही समय में झुंड प्राप्त करने में सक्षम कई धागे
एक चीज जिसे मैं अपडेट करना चाहता था वह है कि झुंड हर समय गलत व्यवहार नहीं करता है, जब संदेशों की टीएक्स दर केवल 2 एमबीपीएस से अधिक होती है तो मैं झुंड के साथ इस डेडलॉक मुद्दे में आ जाता हूं, नीचे टीएक्स दर सब कुछ फाइल है। मैंने num_threads
= 20, size_of_msg
= 1000bytes निरंतर रखा है और केवल 10 संदेशों से 100 संदेशों तक टीएक्स प्रति सेकंड शुरू होने की संख्या में भिन्नता है जो 20 * 1000 * 100 = 2 एमबीपीएस है, जब मैं 150 की संदेशों को बढ़ाता हूं तो झुंड मुद्दा होता है।
मैं सिर्फ पूछना चाहता था कि फ्लॉकफाइल सी एपीआई के बारे में आपकी क्या राय है।
sudo lsof filename.txt
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
push 25569 root 11u REG 253.4 1079 49266853 filename.txt
testEvent 25554 root 27uW REG 253.4 1079 49266853 filename.txt
testEvent 25554 root 28uW REG 253.4 1079 49266853 filename.txt
testEvent 25554 root 29uW REG 253.4 1079 49266853 filename.txt
testEvent 25554 root 30uW REG 253.4 1079 49266853 filename.txt
बहु परीक्षण कार्यक्रम कि write_data_lib_func
lib समारोह कॉल करेंगे।
void* sendMessage(void *arg) {
int* numOfMessagesPerSecond = (int*) arg;
std::cout <<" Executing p thread id " << pthread_self() << std::endl;
while(!terminateTest) {
Record *er1 = Record::create();
er1.setDate("some data");
for(int i = 0 ; i <=*numOfMessagesPerSecond ; i++){
ec = _write_data_lib_func(*er1);
if(ec != SUCCESS) {
std::cout << "write was not successful" << std::endl;
}
}
delete er1;
sleep(1);
}
return NULL;
उपरोक्त विधि परीक्षण के मुख्य कार्य में pthreads में कहा जाएगा।
for (i=0; i<_numThreads ; ++i) {
rc = pthread_create(&threads[i], NULL, sendMessage, (void *)&_num_msgs);
assert(0 == rc);
}
यहाँ लेखक/पाठक स्रोत, मालिकाना कारणों मैं बस में कटौती करने और पेस्ट, लेखक स्रोत एक प्रक्रिया
int write_data_lib_func(Record * rec) {
if(fd == -1) {
fd = open(fn,O_RDWR| O_CREAT | O_APPEND, 0666);
}
if (fd >= 0) {
/* some code */
if(flock(fd, LOCK_EX) < 0) {
print "some error message";
}
else {
if(maxfilesize) {
off_t len = lseek (fd,0,SEEK_END);
...
...
ftruncate(fd,0);
...
lseek(fd,0,SEEK_SET);
} /* end of max spool size */
if(writev(fd,rec) < 0) {
print "some error message" ;
}
if(flock(fd,LOCK_UN) < 0) {
print some error message;
}
में एक से अधिक थ्रेड पहुँचा होगा नहीं करना चाहता था की वजह से है
चीजों के पाठक पक्ष में कोई धागे के साथ एक डेमॉन प्रक्रिया है।
int readData() {
while(true) {
if(fd == -1) {
fd= open (filename,O_RDWR);
}
if(flock (fd, LOCK_EX) < 0) {
print "some error message";
break;
}
if(n = read(fd,readBuf,readBufSize)) < 0) {
print "some error message" ;
break;
}
if(off < n) {
if (off <= 0 && n > 0) {
corrupt_file = true;
}
if (lseek(fd, off-n, SEEK_CUR) < 0) {
print "some error message";
}
if(corrupt_spool) {
if (ftruncate(fd,0) < 0) {
print "some error message";
break;
}
}
}
if(flock(fd, LOCK_UN) < 0)
print some error message ;
}
}
}
क्या आप 'फ़्लॉक' नामक कोड पोस्ट कर सकते हैं? एक [सरल] (http://sscce.org) परीक्षण कार्यक्रम अच्छा होगा। – phihag
AFAIK, सलाहकार ताले स्थिरता की गारंटी नहीं देते हैं। http://www.gsp.com/cgi-bin/man.cgi?section=2&topic=flock – zengr