"থ্রেড-সেফ" শব্দটির অর্থ কী?


367

এর অর্থ কী দুটি থ্রেড একই সাথে অন্তর্নিহিত ডেটা পরিবর্তন করতে পারে না? অথবা এর অর্থ কী যখন প্রদত্ত কোড বিভাগটি অনুমানযোগ্য ফলাফলের সাথে চলবে যখন একাধিক থ্রেড সেই কোড বিভাগটি সম্পাদন করে?


8
এই বিষয় সম্পর্কে এখানে কেবল একটি আকর্ষণীয় আলোচনা দেখেছি: ব্লগস.এমএসএনএন
সেবাস্তিয়ান

উত্তর:


256

উইকিপিডিয়া থেকে:

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

থ্রেড সুরক্ষা অর্জনের কয়েকটি উপায় রয়েছে:

রি-entrancy:

কোডটি এমনভাবে রচনা করুন যাতে এটি একটি কাজ দ্বারা আংশিকভাবে কার্যকর করা যায়, অন্য কোনও কাজ দ্বারা পুনরায় স্থাপন করা যায় এবং তারপরে মূল কাজটি থেকে পুনরায় শুরু করা যায়। এটি স্ট্যাটিক বা গ্লোবাল ভেরিয়েবলের পরিবর্তে প্রতিটি কার্যক্রমে স্থানীয়ভাবে ভেরিয়েবলগুলিতে রাষ্ট্রীয় তথ্য সংরক্ষণের প্রয়োজন।

পারস্পরিক বর্জন:

ভাগ করা ডেটাতে অ্যাক্সেস এমন ব্যবস্থা ব্যবহার করে সিরিয়ালযুক্ত করা হয় যা নিশ্চিত করে যে কেবলমাত্র একটি থ্রেড যে কোনও সময় ভাগ করা ডেটা পড়তে বা লিখতে পারে। এক টুকরো কোডের একাধিক শেয়ারের টুকরো ডেটা অ্যাক্সেস করা হলে দুর্দান্ত যত্ন নেওয়া দরকার — সমস্যাগুলির মধ্যে অনেকগুলি অপারেটিং সিস্টেমের পাঠ্যপুস্তকগুলিতে বর্ণের শর্ত, ডেডলকস, লাইভলকস, অনাহার এবং অন্যান্য বিভিন্ন অসুবিধাগুলি অন্তর্ভুক্ত রয়েছে।

থ্রেড-লোকাল স্টোরেজ:

ভেরিয়েবলগুলি স্থানীয়করণ করা হয় যাতে প্রতিটি থ্রেডের নিজস্ব ব্যক্তিগত অনুলিপি থাকে। এই ভেরিয়েবলগুলি সাবউরটিন এবং অন্যান্য কোডের সীমানা জুড়ে তাদের মানগুলি বজায় রাখে এবং থ্রেড-সেফ হয় যেহেতু তারা প্রতিটি থ্রেডের স্থানীয় হয়, যদিও তাদের কাছে অ্যাক্সেস করা কোডটি পুনরায় হতে পারে।

পারমাণবিক অপারেশন:

পারমাণবিক ক্রিয়াকলাপগুলি ব্যবহার করে ভাগ করা ডেটা অ্যাক্সেস করা হয় যা অন্যান্য থ্রেড দ্বারা বাধা দেওয়া যায় না। এটির জন্য সাধারণত বিশেষ মেশিন ভাষার নির্দেশাবলীর প্রয়োজন হয় যা রানটাইম লাইব্রেরিতে পাওয়া যায়। যেহেতু অপারেশনগুলি পারমাণবিক, তাই ভাগ করা ডেটা সর্বদা একটি বৈধ অবস্থায় রাখা হয়, অন্য থ্রেডগুলি এতে অ্যাক্সেস করে না কেন। পারমাণবিক অপারেশনগুলি অনেকগুলি থ্রেড লকিং পদ্ধতির ভিত্তি তৈরি করে।

আরও পড়ুন:

http://en.wikipedia.org/wiki/Thread_safety



4
এই লিঙ্কটি, প্রযুক্তিগতভাবে, বেশ কয়েকটি সমালোচনামূলক পয়েন্ট হারিয়েছে। প্রশ্নের মধ্যে ভাগ করা মেমরিটি অবশ্যই পরিবর্তনযোগ্য, (কেবল পঠনযোগ্য মেমরিটি থ্রেড-অনিরাপদ হতে পারে না), এবং একাধিক থ্রেডগুলি অবশ্যই ক) মেমরিটির মধ্যবর্তী সময়ে স্মৃতিতে একাধিক লিখিত ক্রিয়াকলাপ সম্পাদন করবে যা স্মৃতিটি বেমানান (ভুল) অবস্থা এবং খ) স্মৃতিটি বেমানান থাকা অবস্থায় অন্যান্য থ্রেডগুলিকে সেই থ্রেডটিতে বাধা দিতে দেয়।
চার্লস বেতানা

20
গুগলে অনুসন্ধান করা হলে প্রথম ফলাফল উইকি হয়, এটিকে এখানে অপ্রয়োজনীয় করার কোনও অর্থ নেই।
রণভীর

"একটি ফাংশন অ্যাক্সেস করার কোড" বলতে কী বোঝ? ফাংশনটি নিজেই কার্যকর করা হচ্ছে কোড, তাই না?
Koray Tugay

82

থ্রেড-সেফ কোড হ'ল এমন কোড যা অনেক থ্রেড একসাথে সম্পাদন করে এমনকি কাজ করবে।

http://mindprod.com/jgloss/threadsafe.html


34
একই প্রক্রিয়া মধ্যে!
আলী আফশার

প্রকৃতপক্ষে, একই প্রক্রিয়াতে :)
মেরেক ব্লটনি

4
"সপ্তাহের জন্য স্থিরভাবে চলবে এমন কোড লিখতে চরম বিড়ম্বনা লাগে" " এটি আমার পছন্দ হওয়া উক্তি :)
জিম টি

5
duh! এই উত্তরটি আবার প্রশ্ন পুনরুদ্ধার করে! --- আর কেন কেবল একই প্রক্রিয়ার মধ্যে ??? যদি কোডটি ব্যর্থ হয় যখন একাধিক থ্রেড এটি বিভিন্ন প্রক্রিয়া থেকে চালিত করে, তবে, তর্কযুক্তভাবে ("ভাগ করা মেমরি" কোনও ডিস্ক ফাইলে থাকতে পারে), এটি থ্রেড নিরাপদ নয় !!
চার্লস বেতানা

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

50

আরও তথ্যমূলক প্রশ্ন হ'ল কোডটি থ্রেডকে সুরক্ষিত করে না - এবং উত্তরটি হ'ল চারটি শর্ত রয়েছে যা অবশ্যই সত্য হতে পারে ... নিম্নলিখিত কোডটি কল্পনা করুন (এবং এটি মেশিন ভাষার অনুবাদ)

totalRequests = totalRequests + 1
MOV EAX, [totalRequests]   // load memory for tot Requests into register
INC EAX                    // update register
MOV [totalRequests], EAX   // store updated value back to memory
  1. প্রথম শর্তটি হ'ল এমন মেমোরি অবস্থান রয়েছে যা একাধিক থ্রেড থেকে অ্যাক্সেসযোগ্য। সাধারণত, এই অবস্থানগুলি গ্লোবাল / স্ট্যাটিক ভেরিয়েবল বা গ্লোবাল / স্ট্যাটিক ভেরিয়েবলগুলি থেকে হিপ মেমরিটি পৌঁছানো যায়। প্রতিটি থ্রেড ফাংশন / পদ্ধতি স্কোপযুক্ত স্থানীয় ভেরিয়েবলগুলির জন্য নিজস্ব স্ট্যাক ফ্রেম পায়, সুতরাং এই স্থানীয় ফাংশন / পদ্ধতি ভেরিয়েবলগুলি, ওটোহ (যা স্ট্যাকের মধ্যে রয়েছে) কেবল সেই স্ট্যাকের মালিকানাধীন এক থ্রেড থেকে অ্যাক্সেসযোগ্য।
  2. দ্বিতীয় শর্তটি হ'ল একটি সম্পত্তি রয়েছে (প্রায়শই একটি আক্রমণকারী বলা হয় ), যা এই ভাগ করা মেমরি অবস্থানগুলির সাথে সম্পর্কিত, যা প্রোগ্রামটি সঠিকভাবে কাজ করার জন্য সত্য বা বৈধ হতে হবে। উপরের উদাহরণে, সম্পত্তিটি হ'ল " মোট রিকুইয়েস্টসকে অবশ্যই কোনও থ্রেড ইনক্রিমেন্ট স্টেটমেন্টের যে কোনও অংশ কার্যকর করেছে তার মোট সংখ্যা সঠিকভাবে উপস্থাপন করতে হবে "। সাধারণত, আপডেটটি সঠিক হওয়ার জন্য কোনও আপডেট হওয়ার আগে এই আক্রমণকারী সম্পত্তিটির সত্য হওয়া উচিত (এক্ষেত্রে মোট রিকুইয়েস্টসকে অবশ্যই একটি সঠিক গণনা রাখতে হবে)।
  3. তৃতীয় শর্ত হ'ল আসল আপডেটের কিছু অংশের সময় আক্রমণকারী সম্পত্তি হোল্ড করে না। (এটি প্রক্রিয়াজাতকরণের কিছু অংশের মধ্যে ক্ষণস্থায়ীভাবে অবৈধ বা মিথ্যা)। এই নির্দিষ্ট ক্ষেত্রে, মোট মূল্য অনুসন্ধানের সময় থেকে আপডেট হওয়া মান সংরক্ষণের সময় অবধি, মোট রিকুইয়েস্টগুলি না করে সন্তুষ্ট ।
  4. চতুর্থ এবং চূড়ান্ত শর্ত যা অবশ্যই একটি দৌড়ের জন্য ঘটতে হবে (এবং কোডটির জন্য "থ্রেড-নিরাপদ" না হওয়ার জন্য) হ'ল আক্রমণকারীটি ভেঙে যাওয়ার সময় অন্য থ্রেডটি অবশ্যই ভাগ করা মেমোরি অ্যাক্সেস করতে সক্ষম হতে হবে , যার ফলে অসঙ্গতি সৃষ্টি হয় বা ভুল আচরণ

6
এটি কেবলমাত্র ডেটা রেস হিসাবে পরিচিত , এবং এটি অবশ্যই গুরুত্বপূর্ণ covers তবুও, অন্যান্য উপায় রয়েছে কীভাবে কোড থ্রেড নিরাপদ হতে পারে না - উদাহরণস্বরূপ খারাপ লক করা যা ডেডলক হতে পারে। এমনকি জাভা থ্রেডের কোথাও System.exit () কল করার মতো সাধারণ কিছু সেই কোডটিকে থ্রেডটি নিরাপদ করে না।
ইনগ্রে

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

1
তবে মনে রাখবেন যে একক থ্রেডেড চলাকালীন অচলাবস্থা ঘটবে না, তাই আমাদের বেশিরভাগের পক্ষে এটি অবশ্যই (থ্রেড-সেফ) নয় (অন্তর্নিহিত) "এর অন্তর্নিহিত অর্থের আওতায় পড়বে।
জন কমস

ঠিক আছে, আপনি মাল্টি-থ্রেডেড অবশ্যই চালাচ্ছেন না হলে ডেডলকগুলি ঘটতে পারে না, তবে এটি বলার মতো যে আপনি যদি একটি মেশিনে চালাচ্ছেন তবে নেটওয়ার্ক সমস্যাগুলি ঘটতে পারে না। প্রোগ্রামার যদি কোডটি লিখেন যাতে আপডেটটি সম্পূর্ণ হওয়ার আগে কোডটির সমালোচনামূলক লাইনগুলি বিচ্ছিন্ন হয়ে যায় এবং অন্য কিছু সাব্রোটিনে পরিবর্তনশীল পরিবর্তন করতে পারে তবে অন্যান্য সমস্যাগুলিও একক থ্রেডযুক্ত ঘটতে পারে।
চার্লস ব্রেটানা

34

অনুশীলনে ব্রায়ান গয়েটসের জাভা কনকুরન્સી থেকে এর ব্যাপকতার জন্য সংজ্ঞাটি আমি পছন্দ করি

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


এই সংজ্ঞাটি অসম্পূর্ণ এবং নির্দিষ্ট নয় এবং অবশ্যই বিস্তৃত নয় definitely এটি একবারে নিরাপদে কতবার চালানো উচিত? দশ বার? প্রত্যেকবার? ৮০% সময়? এবং এটি "অনিরাপদ" কী করে তা নির্দিষ্ট করে না। যদি এটি নিরাপদে চালাতে ব্যর্থ হয়, তবে ব্যর্থতা শূন্য ত্রুটির দ্বারা বিভাজন হওয়ায় এটি এটিকে থ্রেড করে তোলে- "অনিরাপদ"?
চার্লস ব্রেটানা

পরের বার আরও নাগরিক হন এবং সম্ভবত আমরা আলোচনা করতে পারি। এটি রেডডিট নয় এবং আমি অভদ্র লোকদের সাথে কথা বলার মুডে নেই।
বুউ এনগুইন

আপনার অপমান হিসাবে অন্য কারোর সংজ্ঞা সম্পর্কে আপনার ব্যাখ্যার মন্তব্যগুলি বলছে। সংবেদনশীল প্রতিক্রিয়া জানানোর আগে আপনাকে পদার্থটি পড়তে এবং বুঝতে হবে। আমার মন্তব্য সম্পর্কে অস্বস্তিকর কিছুই। আমি সংজ্ঞাটির অর্থ সম্পর্কে একটি বক্তব্য দিচ্ছিলাম। দুঃখিত আমি যদি উদাহরণটি বিন্দুটি উদাহরণ হিসাবে ব্যবহার করেছিলাম তা আপনাকে অস্বস্তি করে তুলেছে।
চার্লস ব্রেটানা

28

অন্যরা যেমন উল্লেখ করেছে, থ্রেড সুরক্ষার অর্থ হ'ল এক টুকরো কোড যদি একবারে একাধিক থ্রেড ব্যবহার করে ত্রুটি ছাড়াই কাজ করবে।

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

উদাহরণস্বরূপ, জাভাতে দুটি শ্রেণি রয়েছে যা প্রায় সমান StringBufferএবং StringBuilder। পার্থক্যটি হ'ল StringBufferথ্রেড-সেফ, সুতরাং এ এর ​​একক উদাহরণStringBuffer একসাথে একাধিক থ্রেড ব্যবহার করতে পারে। StringBuilderথ্রেড-নিরাপদ নয় এবং স্ট্রিংটি কেবল একটি থ্রেড দ্বারা নির্মিত হলে those ক্ষেত্রেগুলির (বৃহত সংখ্যাগরিষ্ঠ) জন্য উচ্চ-পারফরম্যান্স প্রতিস্থাপন হিসাবে ডিজাইন করা হয়েছে।


22

থ্রেড-সেফ-কোড নির্দিষ্ট হিসাবে কাজ করে, এমনকি বিভিন্ন থ্রেড দ্বারা একসাথে প্রবেশ করার পরেও। এর প্রায়শই অর্থ হ'ল, অভ্যন্তরীণ ডেটা-স্ট্রাকচার বা অপারেশনগুলি যা নিরবচ্ছিন্নভাবে চালানো উচিত একই সময়ে বিভিন্ন পরিবর্তনের বিরুদ্ধে সুরক্ষিত।


21

এটি বোঝার একটি সহজ উপায় হ'ল কোডটি থ্রেড-নিরাপদ নয়। দুটি প্রধান সমস্যা রয়েছে যা অযাচিত আচরণের জন্য থ্রেডযুক্ত অ্যাপ্লিকেশন তৈরি করবে।

  • লক না করে ভাগ করা ভেরিয়েবল অ্যাক্সেস করা
    এই ভেরিয়েবলটি ফাংশনটি সম্পাদন করার সময় অন্য থ্রেড দ্বারা সংশোধন করা যেতে পারে। আপনার ফাংশনের আচরণ সম্পর্কে নিশ্চিত হওয়ার জন্য আপনি লকিং মেকানিজম সহ এটি এড়াতে চান। থাম্বের সাধারণ নিয়ম হ'ল খুব কম সময়ের জন্য লক রাখা।

  • ভাগ করা ভেরিয়েবলের উপর পারস্পরিক নির্ভরতার কারণে অচলাবস্থা
    যদি আপনার দুটি ভাগ ভেরিয়েবল এ এবং বি হয় তবে একটি ফাংশনে আপনি প্রথমে লক করেন তারপরে আপনি বি লক করেন এবং অন্য ফাংশনে আপনি বি লক করা শুরু করেন এবং কিছুক্ষণ পরে আপনি এটিকে লক করেন This একটি সম্ভাব্য অচলাবস্থা যেখানে প্রথম ফাংশনটি বি আনলক হওয়ার জন্য অপেক্ষা করবে যখন দ্বিতীয় ফাংশনটি আনলক হওয়ার জন্য অপেক্ষা করবে। এই সমস্যাটি সম্ভবত আপনার বিকাশের পরিবেশে এবং সময়ে সময়ে ঘটবে না। এটি এড়াতে, সমস্ত লক সর্বদা একই ক্রমে থাকা উচিত।


9

হ্যা এবং না.

আপনার ভাগ করা ডেটা একবারে কেবল একটি থ্রেড দ্বারা অ্যাক্সেস করা হয়েছে তা নিশ্চিত করার চেয়ে থ্রেড সুরক্ষা কিছুটা বেশি। আপনি ভাগ করা ডেটা থেকে আনুক্রমিক অ্যাক্সেসের নিশ্চিত করার একই সাথে এড়ানো আছে জাতি অবস্থার , ডেডলক , livelocks , এবং সম্পদ অনাহারে

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


9

সংক্ষেপে, অনেকগুলি একাধিক থ্রেড পরিবেশে ভুল হতে পারে (নির্দেশাবলী পুনরায় অর্ডারিং, আংশিকভাবে নির্মিত বস্তু, সিপিইউ স্তরে ক্যাশে হওয়ার কারণে বিভিন্ন থ্রেডে একই ভেরিয়েবল ইত্যাদি)।

অনুশীলনে জাভা কনকুরেন্সি দ্বারা প্রদত্ত সংজ্ঞাটি আমি পছন্দ করি :

একটি [কোডের অংশ] থ্রেড-সেফ থাকে যদি রানটাইম পরিবেশ দ্বারা এই থ্রেডগুলির নির্বাহের সময়সূচী বা ইন্টারলিভিং নির্বিশেষে এবং কোনও অংশে কোনও অতিরিক্ত সিঙ্ক্রোনাইজেশন বা অন্য সমন্বয় না করে একাধিক থ্রেড থেকে অ্যাক্সেস করার সময় সঠিকভাবে আচরণ করে the কলিং কোড

দ্বারা সঠিকভাবে তারা তার স্পেসিফিকেশনের সঙ্গে সম্মতি অর্থ যে প্রোগ্রাম আচরণ করে।

কৃতিত্বের উদাহরণ

কল্পনা করুন যে আপনি একটি কাউন্টার বাস্তবায়ন করেছেন। আপনি বলতে পারেন যে এটি সঠিকভাবে আচরণ করে যদি:

  • counter.next() ইতিপূর্বে যে মূল্য ফেরানো হয়েছে তা কখনই ফেরায় না (সরলতার জন্য আমরা কোনও ওভারফ্লো ইত্যাদি গ্রহণ করি না)
  • 0 থেকে বর্তমান মান পর্যন্ত সমস্ত মান কোনও পর্যায়ে ফিরে এসেছে (কোনও মান এড়ানো যায় না)

কতগুলি থ্রেড একই সাথে অ্যাক্সেস করে (যা সাধারণত কোনও নিষ্পাপ বাস্তবায়নের ক্ষেত্রে হবে না) নির্বিশেষে কোনও থ্রেড নিরাপদ কাউন্টার সেই নিয়ম অনুসারে আচরণ করবে।

দ্রষ্টব্য: প্রোগ্রামারগুলিতে ক্রস পোস্ট



5

থ্রেডের সুরক্ষাটিকে নির্ধারণবাদের সাথে গুলিয়ে ফেলবেন না। থ্রেড-নিরাপদ কোডটিও অ-নিষ্ক্রিয় হতে পারে। থ্রেডযুক্ত কোড দিয়ে ডিবাগিংয়ের সমস্যাটি দেওয়া, এটি সম্ভবত সাধারণ ঘটনা। :-)

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


5

আমি অন্যান্য ভাল উত্তরের উপরে আরও কিছু তথ্য যুক্ত করতে চাই।

থ্রেড সুরক্ষা বোঝায় একাধিক থ্রেড মেমরির অসঙ্গতি ত্রুটি ছাড়াই একই বস্তুতে ডেটা লিখতে / পড়তে পারে। অত্যন্ত মাল্টি থ্রেডেড প্রোগ্রামে, একটি থ্রেড নিরাপদ প্রোগ্রাম ভাগ করা ডেটাতে পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে না

আরও তথ্যের জন্য এই এসই প্রশ্নটি দেখুন:

থ্রেডসেফ বলতে কী বোঝায়?

থ্রেড নিরাপদ প্রোগ্রাম মেমরির ধারাবাহিকতার গ্যারান্টি দেয়

উন্নত সহবর্তী API এ ওরাকল ডকুমেন্টেশন পৃষ্ঠা থেকে :

মেমরি ধারাবাহিকতা বৈশিষ্ট্য:

জাভা ™ ল্যাঙ্গুয়েজ স্পেসিফিকেশনের ১ Chapter তম অধ্যায় মেমরি অপারেশনে যেমন ভাগ করা ভেরিয়েবলগুলি পড়তে এবং লেখার ক্ষেত্রে সম্পর্কের আগে ঘটে তার সংজ্ঞা দেয়। একটি থ্রেডের দ্বারা লেখার ফলাফলগুলি গ্যারান্টিযুক্ত কেবল অন্য থ্রেড দ্বারা পঠনযোগ্য তবেই লেখার ক্রিয়াকলাপ ঘটে - পঠন অপারেশন হওয়ার আগে

synchronizedএবং volatileনির্মান, সেইসাথে Thread.start()এবং Thread.join()পদ্ধতি, করতে পারেন ফর্ম ঘটে-পূর্বে সম্পর্ক।

সমস্ত শ্রেণীর java.util.concurrentএবং এর উপ - প্যাকেজগুলির পদ্ধতিগুলি এই গ্যারান্টিগুলিকে উচ্চ-স্তরের সিঙ্ক্রোনাইজেশনে প্রসারিত করে নির্দিষ্টভাবে:

  1. কোনও থ্রেডের ক্রিয়াকলাপগুলি কোনও থ্রেডে সংগ্রহ থেকে উপাদানটির অ্যাক্সেস বা অপসারণের পরবর্তী ক্রিয়াকলাপের আগে কোনও বস্তুটিকে কোনও সমবর্তী সংগ্রহে ঘটানোর পূর্বে থ্রেডের ক্রিয়া।
  2. একটি জমা করার পূর্বে একটি থ্রেড মধ্যে পদক্ষেপ Runnableএকটি Executorঘটতে-আগে তার মৃত্যুদন্ড শুরু হয়। একইভাবে কলযোগ্যদের জন্য জমা দেওয়া হয়েছে একটি ExecutorService
  3. অ্যাসিক্রোনাস গণনা দ্বারা গৃহীত Futureপদক্ষেপগুলি ফলাফলের মাধ্যমে পুনরুদ্ধারের পরবর্তী ক্রিয়াগুলির দ্বারা প্রতিনিধিত্ব করেFuture.get()অন্য থ্রেডের ।
  4. "রিলিজ" সিঙ্ক্রোনাইজার পদ্ধতিগুলির Lock.unlock, Semaphore.release, and CountDownLatch.countDownআগে যেমন ক্রিয়াকলাপগুলি একটি সফল "অর্জন" পদ্ধতির পরবর্তী ক্রিয়াকলাপ যেমনLock.lock, Semaphore.acquire, Condition.await, and CountDownLatch.await পরবর্তী থ্রেডে একই সিঙ্ক্রোনাইজার অবজেক্টের
  5. প্রতিটি জোড় থ্রেডের জন্য যা সাফল্যের সাথে একটি এর মাধ্যমে অবজেক্টগুলি আদান- Exchangerপ্রদান করে theexchange() , প্রতিটি থ্রেডের ঘটে-এর পরে অন্য থ্রেডের সাথে সম্পর্কিত এক্সচেঞ্জের () পরে।
  6. কল করার আগে CyclicBarrier.awaitএবং Phaser.awaitAdvance(পাশাপাশি এর রূপগুলি) এর কাজগুলি বাধা ক্রিয়া দ্বারা সম্পাদিত ক্রিয়াকলাপগুলির আগে ঘটেছিল এবং বাধা ক্রিয়া দ্বারা সম্পাদিত ক্রিয়াকলাপগুলি ঘটনার আগে ঘটে থাকে তার পরে অন্যান্য থ্রেডের সাথে প্রত্যাশিত সাফল্যের সাথে সফল প্রত্যাবর্তনের পরে।

4

অন্যান্য উত্তরগুলি সম্পূর্ণ করতে:

সিঙ্ক্রোনাইজেশন কেবল তখনই উদ্বেগ যখন আপনার পদ্ধতির কোড দুটি কাজের মধ্যে একটি করে:

  1. থ্রেড নিরাপদ নয় এমন কিছু বাহ্যিক সংস্থান নিয়ে কাজ করে।
  2. একটি অবিচ্ছিন্ন অবজেক্ট বা বর্গক্ষেত্র পড়তে বা পরিবর্তন করে

এর অর্থ হল আপনার পদ্ধতির সাথে সংজ্ঞায়িত ভেরিয়েবলগুলি সর্বদা থ্রেডসফ থাকে। কোনও পদ্ধতির প্রতিটি কলের এই ভেরিয়েবলগুলির নিজস্ব সংস্করণ থাকে। যদি পদ্ধতিটিকে অন্য থ্রেড, বা একই থ্রেড দ্বারা ডাকা হয়, বা এমনকি যদি পদ্ধতিটি নিজেকে (পুনরাবৃত্তি) বলে ডাকে, এই ভেরিয়েবলগুলির মানগুলি ভাগ করা হয় না।

থ্রেড শিডিংয়ের রাউন্ড-রবিন হওয়ার নিশ্চয়তা নেই । কোনও টাস্ক একই অগ্রাধিকারের থ্রেডের ব্যয়ে সিপিইউকে পুরোপুরি হোগ করতে পারে। বিবেকের জন্য আপনি থ্রেড.ইয়েল্ড () ব্যবহার করতে পারেন। কোনও থ্রেডের অগ্রাধিকার কমিয়ে আনার জন্য আপনি (জাভাতে) Thread.setPriority (Thread.NORM_PRIORITY-1) ব্যবহার করতে পারেন

এছাড়াও সাবধান:

  • এই "থ্রেড-নিরাপদ" কাঠামোগুলি পুনরুক্ত করে এমন অ্যাপ্লিকেশনগুলিতে বৃহত রানটাইম ব্যয় (অন্যদের দ্বারা ইতিমধ্যে উল্লিখিত)
  • থ্রেড.স্লিপ (5000) ঘুমানোর কথা 5 সেকেন্ডের জন্য। তবে, কেউ যদি সিস্টেমের সময় পরিবর্তন করে, আপনি খুব দীর্ঘ সময় ধরে ঘুমাতে পারেন বা মোটেই সময় নেই। অপেক্ষাকৃত নয়, ওএস ওঠার সময়টিকে পরম আকারে রেকর্ড করে।

2

হ্যাঁ এবং হ্যাঁ এটি সূচিত করে যে ডেটা একসাথে একাধিক থ্রেড দ্বারা সংশোধিত হয় না। তবে, আপনার প্রোগ্রামটি প্রত্যাশা মতো কাজ করতে পারে এবং থ্রেড-সেফ প্রদর্শিত হবে, যদিও তা প্রাথমিকভাবে না হয়।

নোট করুন যে ফলাফলের অপ্রতিদ্বন্দ্বিতা হ'ল 'জাতি-পরিস্থিতি'র পরিণাম যা সম্ভবত প্রত্যাশিত ফলাফল ব্যতীত অন্য ক্রমে ডেটা সংশোধন করে।


2

এর উদাহরণ দিয়ে উত্তর দিন:

class NonThreadSafe {

    private int counter = 0;

    public boolean countTo10() {
        count = count + 1;
        return (count == 10);
    }

countTo10পদ্ধতি পাল্টা এক যোগ করা হয়েছে এবং তারপর ফেরৎ সত্য যদি গণনা 10. পৌঁছেছে এটা একমাত্র সত্য একবার ফেরত পাঠাবেন।

এটি যতক্ষণ কাজ করবে কেবলমাত্র একটি থ্রেড কোড চালাচ্ছে। যদি দুটি থ্রেড একই সাথে কোড চালায় তবে বিভিন্ন সমস্যা দেখা দিতে পারে।

উদাহরণস্বরূপ, যদি গণনা 9 হিসাবে শুরু হয়, তবে একটি থ্রেড গণনা করতে 1 যুক্ত করতে পারে (10 তৈরি করে) তবে দ্বিতীয় থ্রেডটি পদ্ধতিতে প্রবেশ করতে পারে এবং প্রথম থ্রেড 10 এর সাথে তুলনা চালানোর সুযোগ পাওয়ার আগে আবার 1 যুক্ত করতে পারে (11) তারপরে উভয় থ্রেড তুলনা করে এবং খুঁজে পাওয়া যায় যে গণনা 11 এবং কোনওটি সত্য হয় না।

সুতরাং এই কোড থ্রেড নিরাপদ নয়।

সংক্ষেপে, সমস্ত মাল্টি-থ্রেডিং সমস্যা এই ধরণের সমস্যার কিছুটা পরিবর্তনের কারণে ঘটে।

সমাধানটি নিশ্চিত করা হয় যে সংযোজন এবং তুলনা পৃথক করা যায় না (উদাহরণস্বরূপ দুটি ধরণের বিবৃতিকে কিছু ধরণের সিঙ্ক্রোনাইজেশন কোড দ্বারা ঘিরে) বা এমন কোনও সমাধানের জন্য যা দুটি অপারেশন প্রয়োজন হয় না। এই জাতীয় কোড থ্রেড-নিরাপদ হবে।


1

কমপক্ষে সি ++ এ, আমি থ্রেড- সেফটিকে কিছুটা মিসনোমার হিসাবে মনে করি যাতে এটি নাম থেকে খুব বেশি দূরে থাকে। থ্রেড-নিরাপদ হতে, কোড সাধারণত এটি সম্পর্কে সক্রিয় হতে হবে। এটি সাধারণত একটি প্যাসিভ গুণ নয়।

কোনও শ্রেণীর পদচারণা-নিরাপদ হওয়ার জন্য এতে "অতিরিক্ত" বৈশিষ্ট্য থাকতে হবে যা ওভারহেড যুক্ত করে। এই বৈশিষ্ট্যগুলি শ্রেণি প্রয়োগের এবং সাধারণভাবে বলতে গেলে ইন্টারফেস থেকে গোপন করার অংশ। এটি হ'ল, বিভিন্ন থ্রেড ক্লাসের সদস্যদের যে কোনও একটির সাথে অবিচ্ছিন্নভাবে কোনও ভিন্ন থ্রেডের সাথে একযোগে অ্যাক্সেসের বিরোধের বিষয়ে চিন্তা না করেই অ্যাক্সেস করতে পারে এবং না করেই সরল পুরাতন নিয়মিত মানব কোডিং স্টাইল ব্যবহার করে খুব অলস পদ্ধতিতে এটি করতে পারে, সমস্ত ক্রেজি সিঙ্ক্রোনাইজেশন স্টাফ যা ইতিমধ্যে কোডের ডাকে of

এবং এ কারণেই কিছু লোক অভ্যন্তরীণভাবে সিঙ্ক্রোনাইজড শব্দটি ব্যবহার করতে পছন্দ করেন ।

পরিভাষা সেট

আমি এই ধারণাগুলির মুখোমুখি হয়েছি এর জন্য তিনটি মূল পরিভাষার সেট রয়েছে। প্রথম এবং historতিহাসিকভাবে আরও জনপ্রিয় (তবে আরও খারাপ) হ'ল:

  1. শংকা মুক্ত
  2. না সুতা নিরাপদ

দ্বিতীয়টি (এবং আরও ভাল):

  1. থ্রেড প্রমাণ
  2. থ্রেড সামঞ্জস্যপূর্ণ
  3. থ্রেড বৈরী

তৃতীয়টি হ'ল:

  1. অভ্যন্তরীণভাবে সিঙ্ক্রোনাইজ করা
  2. বাহ্যিকভাবে সিঙ্ক্রোনাইজ করা
  3. unsynchronizeable

অ্যানালজিস

থ্রেড নিরাপদ ~ থ্রেড প্রমাণ ~ অভ্যন্তরীণভাবে সিঙ্ক্রোনাইজ করা

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

থ্রেড-নিরাপদ নয় (তবে দুর্দান্ত) ~ থ্রেড সামঞ্জস্যপূর্ণ ~ বাহ্যিকভাবে সিঙ্ক্রোনাইজড ~ ফ্রি-থ্রেড

ধরুন আপনি ব্যাঙ্কে যান ব্যাংক টেলারদের জন্য একটি লাইন রয়েছে, অর্থাত্‍ বিতর্ক। কারণ আপনি কোনও বর্বর নন, আপনি বুঝতে পেরেছেন যে কোনও সংস্থার পক্ষে লড়াইয়ের মধ্যে সবচেয়ে ভাল কাজ হ'ল একটি সভ্য সত্তার মতো সারি করা। প্রযুক্তিগতভাবে কেউ আপনাকে এটি করতে বাধ্য করে না। আমরা আশা করি আপনার নিজেরাই এটি করার জন্য আপনার প্রয়োজনীয় সামাজিক প্রোগ্রামিং রয়েছে। এই অর্থে, ব্যাংক লবি বাহ্যিকভাবে সিঙ্ক্রোনাইজ করা হয়। আমাদের কি বলা উচিত যে এটি থ্রেড-অনিরাপদ? যদি আপনি থ্রেড-সেফ , থ্রেড-অনিরাপদ দ্বিপথার পরিভাষা সেট নিয়ে যান তবে এর অর্থ কী। এটি শর্তগুলির খুব ভাল সেট নয়। আরও ভাল পরিভাষা হয় বাহ্যিকভাবে সিঙ্ক্রোনাইজ করা হয়,একাধিক গ্রাহক দ্বারা অ্যাক্সেস পাওয়ার জন্য ব্যাংক লবি বৈরী নয়, তবে সেগুলি সিঙ্ক্রোনাইজ করার কাজটি করে না। গ্রাহকরা নিজেরাই তা করেন।

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

থ্রেড নিরাপদ নয় (এবং খারাপ) ~ থ্রেড বৈরী ~ অবিচ্ছিন্ন able

থ্রেড-বৈরী সিস্টেমের প্রতিদিনের উপমাটির একটি উদাহরণ হ'ল স্পোর্টস গাড়িটি তাদের ব্লিঙ্কারগুলি ব্যবহার করতে অস্বীকার করে এবং লেনগুলি উইলি-নিলিতে অস্বীকার করে some তাদের ড্রাইভিং স্টাইলটি থ্রেড প্রতিকূল বা মনস্তাত্ত্বিক কারণ আপনার সাথে তাদের সাথে সমন্বয় করার কোনও উপায় নেই এবং এটি একই লেনটির জন্য কোনও সমাধান ছাড়াই বিতর্ক সৃষ্টি করতে পারে এবং এভাবে দুটি গাড়ি একই স্থান দখল করার চেষ্টা করে, কোনও প্রোটোকল ছাড়াই দুর্ঘটনা ঘটে to এটি প্রতিরোধ করুন। এই নিদর্শনটি আরও বিস্তৃতভাবে সমাজবিরোধী হিসাবেও বিবেচনা করা যেতে পারে , যা আমি পছন্দ করি কারণ এটি থ্রেডগুলির সাথে কম নির্দিষ্ট এবং তাই প্রোগ্রামিংয়ের অনেক ক্ষেত্রে সাধারণত প্রযোজ্য।

কেন শংকা মুক্ত এট অল। একটি খারাপ পরিভাষা সেট

প্রথম এবং প্রাচীনতম পরিভাষা সেট থ্রেড বৈরিতা এবং থ্রেড সামঞ্জস্যের মধ্যে সূক্ষ্ম পার্থক্য তৈরি করতে ব্যর্থ । থ্রেড সামঞ্জস্যতা তথাকথিত থ্রেড সুরক্ষার চেয়ে বেশি প্যাসিভ, তবে এর অর্থ এই নয় যে বলা হয় কোডটি সহবর্তী থ্রেড ব্যবহারের জন্য অনিরাপদ। এর কেবলমাত্র এটি সিনক্রোনাইজেশন সম্পর্কে প্যাসিভ যা এর অভ্যন্তরীণ বাস্তবায়নের অংশ হিসাবে সরবরাহ করার পরিবর্তে কলিং কোডে এটিকে বন্ধ করে দেয় this থ্রেড সামঞ্জস্যপূর্ণ হ'ল কোডটি সম্ভবত বেশিরভাগ ক্ষেত্রে ডিফল্টরূপে কীভাবে রচনা করা উচিত তবে এটি দুঃখজনকভাবে প্রায়শই ভুলভাবে ভুলভাবে থ্রেডকে অনিরাপদ হিসাবে ভাবা হয়, যেমন এটি সহজাতভাবে বিরোধী সুরক্ষা, যা প্রোগ্রামারদের জন্য বিভ্রান্তির একটি প্রধান বিষয়।

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

আমাদের লক্ষ্যগুলির অনুস্মারক

মূলত, আমাদের লক্ষ্য বিশৃঙ্খলা ফিরিয়ে আনাই।

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

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


1

কোড বা ক্লাসগুলি থ্রেডকে নিরাপদ বা না হিসাবে ভাবার পরিবর্তে, থ্রেড-নিরাপদ বলে ক্রিয়াগুলি ভাবা আরও বেশি সহায়ক বলে আমি মনে করি । দুটি ক্রিয়াকলাপ থ্রেড নিরাপদ যদি তারা নির্বিচারে থ্রেডিং প্রসঙ্গ থেকে চালিত হওয়ার সময় নির্দিষ্টভাবে আচরণ করবে। অনেক ক্ষেত্রে ক্লাসগুলি থ্রেড-নিরাপদ ফ্যাশনে কিছু ক্রিয়াকলাপগুলিকে সমর্থন করবে এবং অন্যরা তা নয়।

উদাহরণস্বরূপ, অ্যারে-তালিকা এবং হ্যাশ সেটগুলির মতো অনেকগুলি সংগ্রহ গ্যারান্টি দিবে যে যদি প্রাথমিকভাবে একটি থ্রেডের সাথে একচেটিয়াভাবে অ্যাক্সেস করা হয় এবং কোনও রেফারেন্স অন্য থ্রেডে দৃশ্যমান হওয়ার পরে এগুলি কখনও সংশোধন করা হয় না, তবে সেগুলি কোনও সংমিশ্রণে স্বেচ্ছাসেবী ফ্যাশনে পড়তে পারে হস্তক্ষেপ ছাড়াই থ্রেড।

আরও মজার বিষয় হল, কিছু নেট হ্যাশ সেট সংকলন যেমন নেট নেট আসল নন-জেনেরিকের মতো, কোনও গ্যারান্টি দিতে পারে যতক্ষণ না কোনও আইটেম কখনও অপসারণ না করা হয় এবং প্রদত্ত যে কেবল একটি থ্রেডই তাদের কাছে লিখিত, যে কোনও থ্রেড চেষ্টা করে সংগ্রহটি পড়ুন এমন কোনও সংগ্রহের অ্যাক্সেসের মতো আচরণ করবে যেখানে আপডেটগুলি বিলম্ব হতে পারে এবং নির্বিচারে ক্রম হতে পারে, তবে যা অন্যথায় স্বাভাবিকভাবে আচরণ করবে। যদি থ্রেড # 1 এক্স এবং তারপরে Y যুক্ত করে, এবং থ্রেড # 2 Y এবং তারপরে এক্সটিকে সন্ধান করে এবং এক্স দেখায়, থ্রেড # 2 এর পক্ষে Y উপস্থিত রয়েছে তবে এক্সটি নেই তা দেখা সম্ভব হবে; এই জাতীয় আচরণ "থ্রেড-সেফ" কিনা তা নির্ভর করে থ্রেড # 2 সেই সম্ভাবনাটি মোকাবেলা করার জন্য প্রস্তুত কিনা।

চূড়ান্ত দ্রষ্টব্য হিসাবে, কিছু শ্রেণি - বিশেষত যোগাযোগ লাইব্রেরিগুলিকে ব্লক করা - এর একটি "নিকট" বা "নিষ্পত্তি" পদ্ধতি থাকতে পারে যা অন্যান্য সমস্ত পদ্ধতির সাথে থ্রেড-নিরাপদ, তবে থ্রেড-নিরাপদ এমন কোনও পদ্ধতি নেই যা শ্রদ্ধার সাথে সুরক্ষিত রয়েছে একে অপরকে. যদি কোনও থ্রেড একটি ব্লকিং রিড অনুরোধ সম্পাদন করে এবং প্রোগ্রামটির কোনও ব্যবহারকারী "বাতিল" ক্লিক করে, পঠন সম্পাদন করার চেষ্টা করছে এমন থ্রেড দ্বারা ঘনিষ্ঠ অনুরোধ জারি করার উপায় নেই। নিকট / নিষ্পত্তি অনুরোধ, তবে, অবিচ্ছিন্নভাবে একটি পতাকা নির্ধারণ করতে পারে যার ফলে পঠন অনুরোধটি যত তাড়াতাড়ি সম্ভব বাতিল করা হবে। একবার কোনও থ্রেডে ঘনিষ্ঠতা সম্পাদন করা হয়ে গেলে, বস্তুটি অকেজো হয়ে যায় এবং ভবিষ্যতের ক্রিয়াকলাপের সমস্ত প্রচেষ্টা অবিলম্বে ব্যর্থ হয়ে যায়,


0

সহজ কথায়: পি কোডের ব্লকে একাধিক থ্রেড চালানো নিরাপদ হলে এটি থ্রেড নিরাপদ *

*শর্ত প্রযোজ্য

শর্তাদি অন্যান্য উত্তরদাতাদের দ্বারা উল্লেখ করা হয় যেমন ১. আপনি যদি একটি থ্রেড বা একাধিক থ্রেড এটি প্রয়োগ করেন তবে ফলাফল একই হওয়া উচিত etc.

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