আমি শেয়ার্ড_পিটার এবং দুর্বল_সিপি খুঁজে পেয়েছি, একটি তালিকা সহ দীর্ঘ, আমার প্রয়োজনীয় কাজটি করেছে। আমার সমস্যাটি ছিল, আমার বেশ কয়েকটি ক্লায়েন্ট একজন হোস্টের অভ্যন্তরীণ ডেটার সাথে ইন্টারঅ্যাক্ট করতে ইচ্ছুক ছিল। সাধারণত, হোস্টটি তার নিজস্ব ডেটা আপডেট করে, তবে, যদি কোনও ক্লায়েন্ট এটির জন্য অনুরোধ করে, কোনও ক্লায়েন্ট হোস্টের ডেটা অ্যাক্সেস না করা পর্যন্ত হোস্টকে আপডেট করা বন্ধ করতে হবে। একই সময়ে, কোনও ক্লায়েন্ট একচেটিয়া অ্যাক্সেসের জন্য জিজ্ঞাসা করতে পারে, যাতে অন্য কোনও ক্লায়েন্ট বা হোস্ট সেই হোস্টের ডেটা পরিবর্তন করতে পারে না।
আমি এটি কীভাবে করেছি, আমি একটি কাঠামো তৈরি করেছি:
struct UpdateLock
{
typedef std::shared_ptr< UpdateLock > ptr;
};
প্রতিটি ক্লায়েন্ট এর একটি সদস্য থাকবে:
UpdateLock::ptr m_myLock;
তারপরে হোস্টটির এক্সক্লুসিভিটির জন্য একটি দুর্বল_পিটার সদস্য এবং অ-একচেটিয়া লকগুলির জন্য দুর্বল_পটারগুলির একটি তালিকা থাকবে:
std::weak_ptr< UpdateLock > m_exclusiveLock;
std::list< std::weak_ptr< UpdateLock > > m_locks;
লকিং সক্ষম করার জন্য একটি ফাংশন রয়েছে এবং হোস্টটি লক রয়েছে কিনা তা পরীক্ষা করতে অন্য একটি ফাংশন রয়েছে:
UpdateLock::ptr LockUpdate( bool exclusive );
bool IsUpdateLocked( bool exclusive ) const;
আমি লকআপডেট, ইসআপডেটলকড এবং নিয়মিত হোস্টের আপডেট রুটিনে লকগুলির জন্য পরীক্ষা করি। লকটির জন্য পরীক্ষা করা দুর্বল_পিটারের মেয়াদ শেষ হয়ে গেছে কিনা তা পরীক্ষা করা এবং এম_লকস তালিকা থেকে কোনও মেয়াদোত্তীর্ণ অপসারণ করার মতোই সহজ (আমি কেবল হোস্ট আপডেটের সময় এটি করি), আমি তালিকাটি খালি কিনা তা পরীক্ষা করে দেখতে পারি; একই সময়ে, যখন কোনও ক্লায়েন্ট তাদের ঝুলন্ত শেয়ার্ড_পিটারটি পুনরায় সেট করে তখন স্বয়ংক্রিয়ভাবে আনলক হয়ে যায়, যখন ক্লায়েন্ট স্বয়ংক্রিয়ভাবে ধ্বংস হয়ে যায় also
সর্বোপরি প্রভাবটি হল, যেহেতু ক্লায়েন্টদের খুব কমই এক্সক্লুসিভিটির প্রয়োজন হয় (সাধারণত সংযোজন এবং মুছে ফেলার জন্য সংরক্ষিত থাকে), বেশিরভাগ সময় লকআপকে (মিথ্যা) অনুরোধ জানানো হয়, যা অ-এক্সক্লুসিভ বলে, এটি এত দিন সফল হয় (! এম_ এক্সক্লুসিভ লক)। এবং একটি লকআপডেট (সত্য), এক্সক্লুসিভিটির জন্য অনুরোধ, কেবল তখনই সফল হয় যখন উভয় (! M_exclusiveLock) এবং (m_locks.empty ()))
এক্সক্লুসিভ এবং অ-এক্সক্লুসিভ লকগুলির মধ্যে হ্রাস করার জন্য একটি সারি যুক্ত করা যেতে পারে, তবে এখনও পর্যন্ত আমার কোনও সংঘর্ষ হয়নি, সুতরাং সমাধানটি যুক্ত হওয়ার জন্য এটি না হওয়া পর্যন্ত আমি অপেক্ষা করার ইচ্ছা করি (বেশিরভাগ ক্ষেত্রেই আমার বাস্তব-বিশ্বের পরীক্ষার শর্ত রয়েছে)।
এখনও পর্যন্ত এটি আমার প্রয়োজনের জন্য ভালভাবে কাজ করছে; আমি এটি প্রসারিত করার প্রয়োজনীয়তা এবং প্রসারিত ব্যবহার সম্পর্কে উত্থাপিত হতে পারে এমন কিছু সমস্যা কল্পনা করতে পারি, তবে এটি কার্যকর করা দ্রুত ছিল এবং এর জন্য খুব কম কাস্টম কোডের প্রয়োজন হয়েছিল।