লিনাক্স সি প্রোগ্রামে একটি পাইথ্রেডের থ্রেড আইডি কীভাবে পাবেন?


94

লিনাক্স সি প্রোগ্রামে, পাইথ্রেড লাইব্রেরি দ্বারা তৈরি থ্রেডের থ্রেড আইডিটি কীভাবে প্রিন্ট করা যায়?
যেমন প্রাক্তন: আমরা কোনও প্রক্রিয়াটির পিড পেতে পারিgetpid()

উত্তর:


81

pthread_self() ফাংশন বর্তমান থ্রেডের থ্রেড আইডি দেবে।

pthread_self()ফাংশনটি কলিং থ্রেডের Pthread হাতল। Pthread_self () ফাংশন কলিং থ্রেডের অবিচ্ছেদ্য থ্রেড ফেরত দেয় না। pthread_getthreadid_np()থ্রেডের জন্য একটি অবিচ্ছেদ্য শনাক্তকারীকে ফেরত দিতে আপনাকে অবশ্যই ব্যবহার করতে হবে ।

বিঃদ্রঃ:

এই কলগুলির তুলনায় উল্লেখযোগ্যভাবে দ্রুত, তবে একই আচরণ সরবরাহ করে।


38
মূল প্রশ্নটি ছিল লিনাক্স সম্পর্কে। লিনাক্সে _np ফাংশন অন্তর্ভুক্ত নয়। (এতে তাদের ম্যান পেজগুলি অন্তর্ভুক্ত নয়, আমি এর চেয়ে আর কোনও চেক করিনি))
ট্রেড-আইডিয়াস ফিলিপ

pthread_threadid_np ওএস এক্স> = 10.6 এবং আইওএস> = 3.2 এ উপলব্ধ।
ব্লিটার

@ ব্লিটার আপনি দয়া করে এর জন্য অফিসিয়াল ডকুমেন্টেশন সরবরাহ করতে পারেন pthread_threadid_np। একটি প্রকল্পের জন্য আমাকে ব্যবহার করার প্রয়োজন আছে, সুতরাং আইওএস এবং ওএসএক্স প্ল্যাটফর্মগুলিতে সেই এপিআইয়ের নির্ভরযোগ্যতা পরীক্ষা করা দরকার। লিঙ্কটি opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.h এ উল্লেখ করেছেন তবে নিশ্চিত হন না যে তারা সঠিক কিনা।
বিবেক মেরান

@ ভিভেকের আমার অফিসিয়াল ডক্সের সাথে কোনও লিঙ্ক নেই, কেবলমাত্র আপনি যে শিরোলেখটি সংযুক্ত করছেন এবং opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.c-
উত্সাহিত করুন

10
@ ট্রেড-আইডিয়া ফিলিপ - স্পষ্ট করার _npঅর্থ , বহনযোগ্য নয়। লিনাক্সের নিজস্ব _npস্টাফ রয়েছে, তবে এতে অ্যাপলের অন্তর্ভুক্ত নেই pthread_getthreadid_np
জোশ কেলি

85

কি? ব্যক্তিটি লিনাক্স নির্দিষ্ট, এবং গেটপিডের সমতুল্য () চেয়েছিল। বিএসডি বা অ্যাপল নয়। উত্তরটি gettid () এবং একটি অবিচ্ছেদ্য টাইপ দেয়। আপনাকে এটির মতো সিসকল () ব্যবহার করে কল করতে হবে:

যদিও এটি নন-লিনাক্স সিস্টেমে পোর্টেবল নাও হতে পারে, থ্রেডিড সরাসরি তুলনীয় এবং অর্জনের জন্য খুব দ্রুত। এটি সাধারণ পূর্ণসংখ্যার মতো মুদ্রিত হতে পারে (যেমন এলওজিগুলির জন্য)।


11
এটি সঠিক উত্তর হওয়া উচিত
ম্যাথিউ এস

ব্যক্তিটি এমন কিছু সম্পর্কে জিজ্ঞাসা করেছিলেন যা লিনাক্সে কাজ করে। পোর্টেবল উপায়ে এটি করা আমার কাছে এটি করার পক্ষে ভাল উপায় বলে মনে হয়। বহনযোগ্যতা যদি কোনও কিছুর জন্য গণনা না করে তবে আমি অনুমান করি যে লিনাক্স সত্যিই নতুন উইন্ডোজ হয়ে উঠছে ...
জ্যাস্পার সিকপেকস

4
@ য্যাস্পার সিপকস আপনি পয়েন্টটি মিস করছেন। তিনি একটি লিনাক্স কল চেয়েছিলেন যা থ্রেডের জন্য গেটপিডের সমতুল্য ছিল। এটি gettid ()। প্রশ্নটি বহনযোগ্যতা বা পসিক্স সম্পর্কে জিজ্ঞাসা করে নি। অনেক লোক জিজ্ঞাসা করা প্রশ্নটি জিজ্ঞাসা না করে দেখানোর চেষ্টা করে শেখাতে চায় teach pthread_self () কার্নেল থ্রেড আইডিটি ফিরিয়ে দেয় না এবং এটি এমনভাবে ম্যানিপুলেটেটেবল হয় না যাতে সহজে মুদ্রণের ব্যবস্থা করা যায়। এছাড়াও, পিথ্রেড_সেল্ফ সম্ভবত পয়েন্টার এবং এটি হস্তান্তর করা উচিত নয়, কেবলমাত্র pthread_equal () এর সাথে তুলনা করা। আপনি যে আইডি প্রিন্ট করতে পারেন তার জন্য প্রশ্ন জিজ্ঞাসা করা হয়েছে, এবং এটিটি ()।
ইভান ল্যাংলোইস

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

14

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

লিনাক্স সিস্টেমে আপনি থ্রেড আইডিটি এইভাবে পেতে পারেন:

অনেক বিএসডি-ভিত্তিক প্ল্যাটফর্মে, এই উত্তরটি https://stackoverflow.com/a/21206357/316487 একটি অ-বহনযোগ্য উপায় দেয়।

তবে, আপনার যদি থ্রেড আইডি লাগার কারণ মনে হয় আপনি যদি একই পদে বা অন্য থ্রেডে চালাচ্ছেন যে কোনও অন্য থ্রেডে আপনি নিয়ন্ত্রণ করছেন কিনা তা জানতে যদি আপনি এই পদ্ধতির কিছুটা ইউটিলিটি খুঁজে পেতে পারেন

আপনি যদি কেবল মূল থ্রেডে রয়েছেন কিনা তা জানতে হলে , অতিরিক্ত উপায় রয়েছে যা এই প্রশ্নের উত্তরে নথিবদ্ধ, আমি কীভাবে বলতে পারি যে pthread_self প্রক্রিয়াটির মূল (প্রথম) থ্রেড কিনা?


13

লিনাক্স আপনাকে কোনও থ্রেডের আইডি পেতে মঞ্জুরি দেয় এমন সিস্টেম কল সরবরাহ করে।


এই উত্তর হিসাবে , আপনার প্রয়োজন #include <unistd.h>এবং #include <sys/syscall.h>এই জন্য।
কমফ্রিচ

9

তুমি ব্যবহার করতে পার pthread_self()

pthread_create()সফলভাবে মৃত্যুদন্ড কার্যকর করার পরে পিতামাতারা থ্রেড আইডি জানতে পারেন তবে থ্রেড এক্সিকিউট করার সময় যদি আমরা থ্রেড আইডি অ্যাক্সেস করতে চাই তবে আমাদের ফাংশনটি ব্যবহার করতে হবে pthread_self()


7

এই একক লাইন আপনাকে পিড, প্রতিটি থ্রেডিড এবং স্পিড দেয়।


3

pthread_getthreadid_npআমার ম্যাক ওএস এক্স এ ছিল না। pthread_tএকটি অস্বচ্ছ ধরণের। এটির উপর আপনার মাথা মারবেন না। কেবল এটিকে বরাদ্দ করুন void*এবং এটি ভাল কল করুন। আপনি করার প্রয়োজন হলে printfব্যবহার %p


4
হ্যাঁ, এটি কাজ করে। আমার কেবল এটি ডিবাগিংয়ের জন্য মুদ্রণ করা দরকার তাই 0x23423423423abcdef জোয়ার = 1234 এর মতো সহায়ক। ধন্যবাদ!
কিউ ফ্যান

3

আমি মনে করি কেবল প্রশ্নটি পরিষ্কার নয়, তবে বেশিরভাগ লোকেরাও এই পার্থক্য সম্পর্কে সচেতন নন। নিম্নলিখিত উক্তিটি পরীক্ষা করুন,

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

এর থেকে উদ্ধৃত: লিনাক্স প্রোগ্রামিং ইন্টারফেস: একটি লিনাক্স এবং ইউনিক্স সিস্টেম প্রোগ্রামিং হ্যান্ডবুক, মাইকেল কেরিক

আইএমএইচও, কেবল একটি বহনযোগ্য পথ যা একটি কাঠামো পেরিয়ে যায় যার মধ্যে একটি চলক হোল্ডিং সংখ্যাকে একটি আরোহী পদ্ধতিতে সংজ্ঞায়িত করা হয় যেমন 1,2,3... প্রতি থ্রেড পর্যন্ত। এটি করার মাধ্যমে থ্রেডের আইডি ট্র্যাক করা যায়। তবুও, int pthread_equal(tid1, tid2)ফাংশন ব্যবহার করা উচিত।


gettid()আসলে একটি ভাল পরামর্শ, আপনাকে ধন্যবাদ! যাইহোক, আমাকে এখানে সার্জি এল দ্বারা উত্তর অনুসরণ করা দরকার: stackoverflow.com/a/21280941/2430526
এসআরজি ২

1

থ্রেড আইডি পাওয়ার আরও একটি উপায় রয়েছে। দিয়ে থ্রেড তৈরি করার সময়

int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);

ফাংশন কল; প্রথম প্যারামিটারটি pthread_t * threadআসলে একটি থ্রেড আইডি (এটি বিট / pthreadtypes.h এ সংজ্ঞায়িত স্বাক্ষরযুক্ত দীর্ঘ int হয়)। এছাড়াও, শেষ আর্গুমেন্টটি void *argসেই যুক্তিটি যা void * (*start_routine)থ্রেড করার জন্য ফাংশনে প্রেরণ করা হয় ।

আপনি একাধিক আর্গুমেন্ট পাস করতে একটি কাঠামো তৈরি করতে পারেন এবং কোনও কাঠামোতে একটি পয়েন্টার পাঠাতে পারেন।


-1

আপনি এই পদ্ধতিতে লিখতে পারেন এবং এটি একই কাজ করে। যেমন:

এই প্রোগ্রামটি pthread_t এর একটি অ্যারে সেট করে এবং প্রত্যেকটির জন্য যোগফল গণনা করে। সুতরাং এটি প্রতিটি থ্রেডের যোগফলকে থ্রেড আইডি দিয়ে মুদ্রণ করছে।


এটি প্রশ্নের উত্তর দেয় না, এমনকি কোডটির বিবরণও ভুল!
মার্কিন উইন্ডেল

-2

প্ল্যাটফর্ম-স্বতন্ত্র উপায় (সি ++ 11 থেকে শুরু):


আপনার সম্ভবত এটি সম্ভবত "প্ল্যাটফর্ম স্বতন্ত্র" হিসাবে নয়। আমার বাস্তবায়নে এটি একটি এর সমাধান হয় pthread_t। একটি ম্যাকের মধ্যে যা পয়েন্টার এবং লিনাক্সে একটি পূর্ণসংখ্যা হবে। এটি topউদাহরণস্বরূপ আপনি যে "নেটিভ" আইডিটি দেখতে পাবেন তা প্রতিফলিত করে না । কিছু সচেতন হতে হবে, তবে এটি কিছু ব্যবহারের জন্য জরিমানা।
ব্র্যাড অলরেড

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