بيع كائن مع الكائنات الموزعة ومزامنة الوصول

StackOverflow https://stackoverflow.com/questions/1481453

  •  18-09-2019
  •  | 
  •  

سؤال

أنا أستخدم الكائنات الموزعة في طلبي لتوفير الاتصال بين برنامج وكيل المصادقة الصغير والتطبيق الرئيسي. يطرد التطبيق الرئيسي NSTASK's، مما يؤدي بدوره إلى استدعاء برنامج المصادقة، والذي سيتصل بدوره مرة أخرى إلى البرنامج الرئيسي للحصول على بعض بيانات اعتماد المستخدمين. أعلم أنه يبدو ملكيا، لكنه يجب أن يعمل بهذه الطريقة بسبب الطريقة التي تحصل عليها ssh كلمات مرور من برنامج في ssh_askpathpath.

في تطبيقي الرئيسي، لدي مثيل واحد من كائن يسمى PasswordDialog، الذي أبعده كما يلي؛

PasswordDialog *vendedPasswordDialog=[[PasswordDialog alloc] init];  
[[NSConnection defaultConnection] setRootObject:vendedPasswordDialog];
[[NSConnection defaultConnection] registerName:@"MyConnectionName"]

يحدث هذا مرة واحدة عندما يبدأ التطبيق.

في وكيل المصادقة، اتصل مرة أخرى بهذا الكائن كما يلي؛

NSConnection *passwordDialogConnection = [NSConnection connectionWithRegisteredName:@"MyConnectionName" host:nil];

PasswordDialog *pdProxy = (PasswordDialog*)[passwordDialogConnection rootProxy];

NSString *responseStr = [pdProxy responseForPID:pidString host:hostnameString user:usernameString processInfo:[NSProcessInfo processInfo]];

المشكلة هي أن هذا لا يعمل كما أرغب في ذلك. إذا كان هناك عملاء مصادقة متعددة يتم تنفيذهم في وقت واحد، أجد أنه يمكنهم الوصول إلى نفس الكائن واستدعاء الطريقة نفسها في وقت واحد. على سبيل المثال، إذا وضعت عبارة سجل في بداية "ResponseForpid" وفي النهاية، أحصل على إخراج مثل هذا؛

beginMethod PID 3618848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4882384 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4872848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>

PID endMethod 4872848
PID endMethod 4882384
PID endMethod 3618848

يبدو أن هناك ثلاث عمليات مختلفة تدخل طريقتي على نفس الخيط على كائن بنفس العنوان. من الواضح أنني أفتقد بعض الفهم الأساسي للكائنات الموزعة والخيوط هنا، ولكن هذا يبدو وكأنه سحر؟

في النهاية أتوصل إلى سؤالي (ق)

(أ) هل يمكن لشخص ما أن يفسر ما يجري هنا (أي كيف يمكنني الحصول على بيانات السجل على النحو الوارد أعلاه)

(ب) من الواضح أنني أستخدم الكائنات الموزعة بشكل غير صحيح لغرضي. هل يمكن لأي شخص أن يقترح كيف يمكنني القيام بذلك بشكل صحيح.

شكرا جزيلا على القراءة حتى نهاية هذا السؤال!


تحرير: فقط للتوضيح. طريقة "رادته" الخاصة بي تبدو مثل هذا؛

- (NSString*) responseForPID:(NSString*) pid host:(NSString*)hostname user:(NSString*) username processInfo:(NSProcessInfo*) info {

NSLog(@"beginMethod PID %@ on thread %@ for object %@",pid,[NSThread currentThread],self);

.... code to get the password 

NSLog(@"PID endMethod %@",pid);
return passwordString;

}
هل كانت مفيدة؟

المحلول

beginMethod PID 3618848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4882384 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4872848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>

PIDs مختلفة تماما، مما يشير إلى أن المواضيع تنفذ في عمليات مختلفة.

لذلك، لا، لا يوجد الوصول في وقت واحد إلى الطريقة على موضوع واحد. أن معرفات الخيط هي نفسها من المرجح أن تعاد النظر فيها؛ نظرا لأن العمليات الثلاثة هي بسيطة نسبيا وتبدأ بنفس الطريقة، فإن المواضيع التي يتم تخصيصها في نفس العنوان في كل (أو أكثر احتمالا، فإن الخيط الرئيسي هو دائما على نفس العنوان بطبيعة تهيئة التطبيق).

حاول الطباعة [NSThread currentThread] عندما تبشر خطوط السجل هذه وليس فقط السلسلة من العملية البعيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top