PTHREAD_MUTEX_INITIALIZER বনাম pthread_mutex_init (& মুটেক্স, প্যারাম)


91

এর মধ্যে কোনও পার্থক্য আছে কি?

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

বা

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

আমি যদি কেবল প্রথম পদ্ধতিটি ব্যবহার করি তবে আমি কি যথেষ্ট নিরাপদ?

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

উত্তর:


74

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

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

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


8

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

স্থির পদ্ধতির সাথে কোনও ভুল নেই যদিও, এটি যদি আপনার প্রয়োজনের সাথে খাপ খায়।


" প্লাস আপনি চালনার সময় একগুচ্ছ মিটেক্সেস যুক্ত করলেই আপনি গতিশীল পদ্ধতিটি ব্যবহার করতে পারেন So" সুতরাং, এর অর্থ কী? একটি ছোট উদাহরণ যদি ব্যাখ্যা করা সহজ হয় না?
ক্যালেক

4
@ ক্যালেক: আপনার মুটেক্স যদি বরাদ্দ করা হয় malloc()(বা বরাদ্দ করা কোনও সামগ্রীর অন্তর্গত)।
মাইকেল বুড়

4
@ ক্যালেক যদি মিটেক্স ভেরিয়েবল "লক" কোনও কাঠামোর অংশ হয় তবে আমরা 1 ম পদ্ধতির অনুসরণ করতে পারি না। আমাদের pthread_init () ব্যবহার করতে হবে।
পঙ্কজ কুশওয়াহা

8

আমি এই বইটি থেকে এই উদ্ধৃতি দিতে চাই :

সঙ্গে POSIXথ্রেড, সেখানে কেশ আরম্ভ করতে দুটি উপায় আছে। এটি করার একটি উপায় PTHREAD_MUTEX_INITIALIZERনিম্নরূপ: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

এটি করার ফলে লকটিকে ডিফল্ট মানগুলিতে সেট করা হয় এবং এভাবে লকটি ব্যবহারযোগ্য হয়। এটি করার গতিশীল উপায় (অর্থাত্ রান সময়) pthread_mutex_init()নিম্নলিখিতটিতে কল করতে হবে : int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

এই রুটিনের প্রথম যুক্তিটি হ'ল লকের ঠিকানা, যেখানে দ্বিতীয়টি বৈশিষ্ট্যের একটি setচ্ছিক সেট। গুণাবলী সম্পর্কে নিজেকে আরও পড়ুন; NULL পাস করার জন্য কেবল ডিফল্ট ব্যবহার করা হয়। যে কোনও উপায়ে কাজ করে তবে আমরা সাধারণত গতিশীল (পরের) পদ্ধতিটি ব্যবহার করি।


5

ক্ষেত্রে যেখানে ডিফল্ট মিউটেক্স বৈশিষ্ট্য যথাযথ হয়, ম্যাক্রো PTHREAD_MUTEX_INITIALIZER টি মিউটেক্সগুলি সূচনা করতে ব্যবহার করা যেতে পারে।

আপনি যদি মুটেক্সের জন্য বৈশিষ্ট্যগুলি নির্দিষ্ট করতে চান তবে গতিশীল সূচনা দিয়ে যান ........

প্রভাবটি ত্রুটি পরীক্ষা করা হয় ব্যতীত NUL হিসাবে পরিমিতিযুক্ত প্যারামিটার সহ pthread_mutex_init () এ কল করে গতিশীল সূচনার সমান হবে।

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