Объединить объект с распределенными объектами и синхронизирующий доступ

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

  •  18-09-2019
  •  | 
  •  

Вопрос

Я использую распределенные объекты в своем приложении для обеспечения связи между крошечной программой агента аутентификации и основным приложением. Основное приложение порождает NSTASK, которое, в свою очередь, будет вызывать программу аутентификации, которая, в свою очередь, перезвонит в основную программу, чтобы получить некоторые учетные данные пользователя. Я знаю, что это звучит запутанно, но это должно работать таким образом из -за того, как SSH получает пароли от программы в SSH_ASKPATH.

В моем основном приложении у меня есть один экземпляр объекта с именем 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]];

Проблема в том, что это не работает, как я хотел бы. Если существует несколько агентов аутентификации, выполняющих одновременно, я обнаружил, что они могут получить доступ к одному и тому же объекту и одновременно вызовут один и тот же метод. Например, если я помесчу оператор журнала в начале «responsefort», и в конце я получаю такой вывод;

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>

Все PID разные, что указывает на то, что потоки выполняются в разных процессах.

Так что нет, в одном потоке нет одновременного доступа к методу. То, что идентификаторы потока одинаковы, вероятно, случайно; Поскольку три процесса относительно просты и запускаются одинаково, потоки распределяются по одному и тому же адресу в каждом (или, скорее всего, основной поток всегда находится на одном и том же адресу по характеру инициализации приложения).

Попробуйте печатать [NSThread currentThread] Когда вы извергаете эти строки журнала, а не только строку из удаленного процесса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top