সফ্টওয়্যার লেনদেনের মেমরির সামঞ্জস্যতার উদাহরণ


11

সফ্টওয়্যার লেনদেনের মেমরির অন্যতম প্রধান সুবিধা যা সর্বদা উল্লেখ করা হয় তা হ'ল সামঞ্জস্যতা এবং মডুলারিটি। বিভিন্ন টুকরা বৃহত্তর উপাদান উত্পাদন একত্রিত করা যেতে পারে। লক-ভিত্তিক প্রোগ্রামগুলিতে, এটি প্রায়শই হয় না।

আমি প্রকৃত কোড সহ এটি চিত্রিত করার জন্য একটি সাধারণ উদাহরণ খুঁজছি। আমি ক্লোজুরে উদাহরণ পছন্দ করব, তবে হাস্কেলও ঠিক আছে। বোনাস পয়েন্ট যদি উদাহরণটিতে কিছু লক-ভিত্তিক কোড প্রদর্শিত হয় যা সহজে রচনা করা যায় না।


1
আকর্ষণীয়, তবে এটি আমার কাছে স্ট্যাকওভারফ্লো প্রশ্নের মতো মনে হচ্ছে।
স্টিভ

এই প্রশ্নটি 4 মিনিট পরে সেখানে জিজ্ঞাসা করা হয়েছে। stackoverflow.com/questions/5518546/… কেউ এই প্রশ্নটি স্থানান্তর ও মার্জ করবেন (যদি সম্ভব হয়)?
চাকরি

হ্যাঁ আমি এখানে এটি পোস্ট করার পরে, আমি বুঝতে পারি এটি সম্ভবত স্ট্যাকওভারফ্লোতে আরও ভাল হবে be কেউ যদি এটি একীভূত করতে পারে তবে আমার সাথে ঠিক আছে।
dbyrne

উত্তর:


9

মনে করুন আপনার কিছু ব্যাংক অ্যাকাউন্ট রয়েছে:

(def accounts 
 [(ref 0) 
  (ref 10) 
  (ref 20) 
  (ref 30)])

এবং একটি পারমাণবিক "স্থানান্তর" ফাংশন:

(defn transfer [src-account dest-account amount]
  (dosync
    (alter dest-account + amount)
    (alter src-account - amount)))

যা নিম্নলিখিত হিসাবে কাজ করে:

(transfer (accounts 1) (accounts 0) 5)

(map deref accounts)
=> (5 5 20 30)

তারপরে আপনি উচ্চতর স্তরের লেনদেন তৈরি করতে সহজেই স্থানান্তর ফাংশন রচনা করতে পারেন, উদাহরণস্বরূপ একাধিক অ্যাকাউন্ট থেকে স্থানান্তর:

(defn transfer-from-all [src-accounts dest-account amount]
  (dosync
    (doseq [src src-accounts] 
      (transfer src dest-account amount))))

(transfer-from-all 
  [(accounts 0) (accounts 1) (accounts 2)] 
  (accounts 3) 
  5)

(map deref accounts)
=> (0 0 15 45)

দ্রষ্টব্য যে একাধিক স্থানান্তর সমস্ত একক, সম্মিলিত লেনদেনে হয়েছিল, অর্থাত্ ছোট লেনদেনগুলি "রচনা" করা সম্ভব হয়েছিল।

লক দিয়ে এটি করা খুব দ্রুত জটিল হয়ে উঠবে: অ্যাকাউন্টগুলি স্বতন্ত্রভাবে লক করা দরকার তা ধরে নিলে আপনার অচলাবস্থা এড়াতে লক অধিগ্রহণের আদেশে একটি প্রোটোকল স্থাপন করার মতো কিছু করা দরকার। হার্ড-টু-ডিটেক্ট ভুল করা খুব সহজ। এসটিএম আপনাকে এই সমস্ত ব্যথা থেকে বাঁচায়।

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