@ সিঙ্ক্রোনাইজড () উদ্দেশ্য সি তে একক পদ্ধতি হিসাবে কী করে?


88

আমি সবেমাত্র একটি সিঙ্গলটন পদ্ধতি তৈরি করেছি এবং আমি ফাংশনটি কী করে তা জানতে চাই @synchronized(), কারণ আমি প্রায়শই এটি ব্যবহার করি তবে এর অর্থ জানি না।

উত্তর:


119

এটি কোড ব্লকের চারপাশে একটি সমালোচনা বিভাগ ঘোষণা করে । মাল্টিথ্রেডেড কোডে, @synchronizedগ্যারান্টি দেয় যে কেবলমাত্র একটি থ্রেড কোনও নির্দিষ্ট সময়ে ব্লকটিতে সেই কোডটি কার্যকর করতে পারে।

এটি কী করে তা সম্পর্কে যদি আপনি অবগত না হন তবে আপনার অ্যাপ্লিকেশনটি সম্ভবত মাল্টিথ্রেড নয়, এবং আপনার সম্ভবত এটি ব্যবহার করার প্রয়োজন নেই (বিশেষত যদি সিঙ্গলটন নিজেই থ্রেড-নিরাপদ নয়)।


সম্পাদনা করুন: আরও কিছু তথ্য যুক্ত করা যা ২০১১ সাল থেকে মূল উত্তরে ছিল না।

@synchronizedনির্দেশ করে একটি দ্বারা সুরক্ষিত কোডের কোন অঞ্চল প্রবেশে একাধিক থ্রেড বাধা দেয় @synchronizedনির্দেশ একই বস্তুর উল্লেখ@synchronizedনির্দেশটিতে পাস করা অবজেক্টটি সেই অবজেক্ট যা "লক" হিসাবে ব্যবহৃত হয়। দুটি থ্রেড কোডের একই সুরক্ষিত অঞ্চলে থাকতে পারে যদি আলাদা কোনও অবজেক্ট লক হিসাবে ব্যবহৃত হয় এবং আপনি লকের মতো একই অবজেক্টটি ব্যবহার করে কোডের দুটি সম্পূর্ণ ভিন্ন অঞ্চল রক্ষা করতে পারেন।

এছাড়াও, আপনি যদি nilলক অবজেক্ট হিসাবে পাস হয়ে যান তবে কোনও লক নেওয়া হবে না।


14
কয়েকটি গুরুত্বপূর্ণ পয়েন্ট: ১) আপনি যদি @synchronizedএটিতে শূন্য পয়েন্টার ব্যবহার করেন তবে কিছুই করেনা - আপনি অরক্ষিত হয়ে গেছেন। 2) @synchronizedহয় ধীর
হট লিক্স

এই উত্তরটি বিভ্রান্তিকর, এবং এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। যদিও এটি যা বলে তা কখনও কখনও সঠিক হবে (যতক্ষণ না টোকেন সিঙ্ক্রোনাইজড হয়ে গেছে সমস্ত থ্রেডে একই জিনিস) তবে এটি বিভ্রান্তিকরভাবে অসম্পূর্ণ। সিঙ্ক্রোনাইজড সংযুক্ত কোড বিভাগগুলিকে একই সাথে কার্যকর করতে বাধা দেয়, কেবল "ব্লকের সেই কোড" নয়। সিঙ্ক্রোনাইজ করার জন্য প্যারামিটার কার্যকরভাবে নির্ধারণ করে যে কোডগুলির কোন বিভাগগুলি (বা উত্তরগুলি তাদেরকে "ব্লকগুলি" বলে দেয়) সহবর্তী অ্যাক্সেস থেকে সুরক্ষিত।
আর্দা

@ অর্দা আপনি পুরোপুরি ঠিক বলেছেন। আমি কিছুটা আরও তথ্য এবং কিছু অ্যাপল ডকুমেন্টেশনের লিঙ্ক যুক্ত করেছি @synchronized
জন কলসবিেক

@ জনকলসবিেক, উত্তরটি এখন আরও ভাল দেখাচ্ছে। আমার কাছ থেকে থাম্বস আপ।
আরদা

@ হটলিক্স এটি উল্লেখ করা আকর্ষণীয়, তবে বিকল্পগুলি (লিঙ্কগুলি) কী কী হতে পারে তা সংক্ষেপে বলতে গেলে আরও ভাল হত
Itaxax

43

অ্যাপল ডকুমেন্টেশন থেকে এখানে এবং এখানে :

@ সিঙ্ক্রোনাইজড নির্দেশিকা উদ্দেশ্য-সি কোডে ফ্লাইতে মিটেক্স লক তৈরি করার একটি সুবিধাজনক উপায়। @ সিনক্রোনাইজড নির্দেশনাটি অন্য যে কোনও মিটেক্স লকটি করবে তা করে — এটি একই সাথে একই থ্রোকে একই থ্রো থেকে প্রাপ্ত হওয়া থেকে বিভিন্ন থ্রেডকে বাধা দেয়।

ডকুমেন্টেশন এই বিষয়ে তথ্য প্রচুর সরবরাহ করে। এটি পড়ার জন্য এটি সময় দেওয়ার উপযুক্ত, বিশেষত আপনি এটি কী করছেন তা না জেনে এটি ব্যবহার করে চলেছেন।


27

@synchronizedডিরেক্টিভের একটি সুবিধাজনক ভাবে উড়ে mutex কেশ তৈরি করা উদ্দেশ্য সি কোড।

দ্য @synchronizedডিরেক্টিভের অন্য কোন mutex লক কি এটি হবে কি একই সময়ে একই লক অর্জন থেকে আলাদা থ্রেড বাধা দেয়।

বাক্য গঠন:

 @synchronized(key) 
 { 
  // thread-safe code 
 }

উদাহরণ:

 -(void)AppendExisting:(NSString*)val
{
  @synchronized (oldValue) {
      [oldValue stringByAppendingFormat:@"-%@",val];
  }
}

এখন উপরের কোডটি পুরোপুরি থ্রেড নিরাপদ..এখন একাধিক থ্রেড মান পরিবর্তন করতে পারে।

উপরেরটি কেবল একটি অস্পষ্ট উদাহরণ ...


4
এটি কি সিংক্রোনাইজড (ওল্ডভ্যালু) হওয়া উচিত নয়?
জোয়েল

নাকি @synchronized(val, oldValue) { ... }?
ভ্যালেন্টিন শেরগিন

আমি নিশ্চিত নই যে আমি এমন কোনও স্কিম দেখেছি যা "নিখুঁতভাবে থ্রেড নিরাপদ" ছিল। খুব কমপক্ষে আপনার জানা দরকার যে আপনি কী করছেন এবং কোথাও অন্ধভাবে কোড অনুলিপি করছেন না।
হট লিকস

তবে আমি মনে করি উপরের কোডটি সর্বোপরি "পুরোপুরি থ্রেড নিরাপদ", কারণ এটি একেবারেই কিছুই করে না।
হট লিকস

6

@ সিনক্রোনাইজড ব্লক আপনার জন্য স্বয়ংক্রিয়ভাবে লকিং এবং আনলকিং পরিচালনা করে । @ সিঙ্ক্রোনাইজ করুন আপনি সিঙ্ক্রোনাইজ করতে ব্যবহার করছেন এমন অবজেক্টের সাথে আপনার একটি অন্তর্নিহিত লক যুক্ত। এখানে এই বিষয়ে খুব তথ্যপূর্ণ আলোচনা এখানে দয়া করে অনুসরণ করুন @ সিঙ্ক্রোনাইজড লক / আনলকটি কীভাবে উদ্দেশ্য-সি-তে রয়েছে?



-2

@synchronizedহয় thread safeপ্রক্রিয়া। এই ফাংশনের অভ্যন্তরে লিখিত কোডের টুকরো অংশ হয়ে যায় critical section, যেখানে একবারে কেবল একটি থ্রেড কার্যকর করা যায়।

@synchronizeলকটি NSLockস্পষ্টভাবে প্রয়োগ করে যেখানে এটি সুস্পষ্টভাবে প্রযোজ্য।

এটি কেবল থ্রেড সুরক্ষার নিশ্চয়তা দেয়, এর গ্যারান্টি দেয় না। আমার অর্থ হ'ল আপনি নিজের গাড়ীর জন্য বিশেষজ্ঞ ড্রাইভার ভাড়া রাখেন, তবুও এটি কোনও দুর্ঘটনার মুখোমুখি হওয়ার গ্যারান্টি দেয় না। তবে সম্ভাবনা সামান্যতম থেকে যায়।


4
এটি একেবারে ভুল। dispatch_once @ syncrhonized এর মতো করে না, এটি সিঙ্গলটনের বরাদ্দের আওতায় কেবল বিকল্প হতে পারে।
jugtier
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.