লিনাক্স সি প্রোগ্রামে, পাইথ্রেড লাইব্রেরি দ্বারা তৈরি থ্রেডের থ্রেড আইডিটি কীভাবে প্রিন্ট করা যায়?
যেমন প্রাক্তন: আমরা কোনও প্রক্রিয়াটির পিড পেতে পারিgetpid()
উত্তর:
pthread_self()
ফাংশন বর্তমান থ্রেডের থ্রেড আইডি দেবে।
pthread_t pthread_self(void);
pthread_self()
ফাংশনটি কলিং থ্রেডের Pthread হাতল। Pthread_self () ফাংশন কলিং থ্রেডের অবিচ্ছেদ্য থ্রেড ফেরত দেয় না। pthread_getthreadid_np()
থ্রেডের জন্য একটি অবিচ্ছেদ্য শনাক্তকারীকে ফেরত দিতে আপনাকে অবশ্যই ব্যবহার করতে হবে ।
বিঃদ্রঃ:
pthread_id_np_t tid;
tid = pthread_getthreadid_np();
এই কলগুলির তুলনায় উল্লেখযোগ্যভাবে দ্রুত, তবে একই আচরণ সরবরাহ করে।
pthread_id_np_t tid;
pthread_t self;
self = pthread_self();
pthread_getunique_np(&self, &tid);
pthread_threadid_np
। একটি প্রকল্পের জন্য আমাকে ব্যবহার করার প্রয়োজন আছে, সুতরাং আইওএস এবং ওএসএক্স প্ল্যাটফর্মগুলিতে সেই এপিআইয়ের নির্ভরযোগ্যতা পরীক্ষা করা দরকার। লিঙ্কটি opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.h এ উল্লেখ করেছেন তবে নিশ্চিত হন না যে তারা সঠিক কিনা।
_np
অর্থ , বহনযোগ্য নয়। লিনাক্সের নিজস্ব _np
স্টাফ রয়েছে, তবে এতে অ্যাপলের অন্তর্ভুক্ত নেই pthread_getthreadid_np
।
কি? ব্যক্তিটি লিনাক্স নির্দিষ্ট, এবং গেটপিডের সমতুল্য () চেয়েছিল। বিএসডি বা অ্যাপল নয়। উত্তরটি gettid () এবং একটি অবিচ্ছেদ্য টাইপ দেয়। আপনাকে এটির মতো সিসকল () ব্যবহার করে কল করতে হবে:
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
যদিও এটি নন-লিনাক্স সিস্টেমে পোর্টেবল নাও হতে পারে, থ্রেডিড সরাসরি তুলনীয় এবং অর্জনের জন্য খুব দ্রুত। এটি সাধারণ পূর্ণসংখ্যার মতো মুদ্রিত হতে পারে (যেমন এলওজিগুলির জন্য)।
getpid()
উদাহরণ হিসাবে দেওয়া হয়েছিল। এটি বলে নি যে শব্দার্থবিজ্ঞান একটি কঠিন স্পেসিফিকেশন ছিল। লোকেরা পসিক্সের সাথে সামঞ্জস্যপূর্ণ উপায়ে কাজ করার বিষয়ে সচেতন করা যাতে লিনাক্সের পাশাপাশি অন্যান্য সম্প্রদায়গুলি (যেমন ফ্রিবিএসডি, ইলিমোস, ওএস এক্স, ইত্যাদি) তাদের থেকে উপকৃত হতে পারে "দেখানো" নয়। আমি যেমন বলেছিলাম অনুমান করি লিনাক্স সত্যই পরবর্তী উইন্ডোজ হয়ে গেছে।
অন্যান্য উত্তরে উল্লিখিত হিসাবে, পাইথ্রেডগুলি একটি অবিচ্ছেদ্য থ্রেড আইডি পুনরুদ্ধারের প্ল্যাটফর্ম-স্বতন্ত্র উপায় নির্ধারণ করে না।
লিনাক্স সিস্টেমে আপনি থ্রেড আইডিটি এইভাবে পেতে পারেন:
#include <sys/types.h>
pid_t tid = gettid();
অনেক বিএসডি-ভিত্তিক প্ল্যাটফর্মে, এই উত্তরটি https://stackoverflow.com/a/21206357/316487 একটি অ-বহনযোগ্য উপায় দেয়।
তবে, আপনার যদি থ্রেড আইডি লাগার কারণ মনে হয় আপনি যদি একই পদে বা অন্য থ্রেডে চালাচ্ছেন যে কোনও অন্য থ্রেডে আপনি নিয়ন্ত্রণ করছেন কিনা তা জানতে যদি আপনি এই পদ্ধতির কিছুটা ইউটিলিটি খুঁজে পেতে পারেন
static pthread_t threadA;
// On thread A...
threadA = pthread_self();
// On thread B...
pthread_t threadB = pthread_self();
if (pthread_equal(threadA, threadB)) printf("Thread B is same as thread A.\n");
else printf("Thread B is NOT same as thread A.\n");
আপনি যদি কেবল মূল থ্রেডে রয়েছেন কিনা তা জানতে হলে , অতিরিক্ত উপায় রয়েছে যা এই প্রশ্নের উত্তরে নথিবদ্ধ, আমি কীভাবে বলতে পারি যে pthread_self প্রক্রিয়াটির মূল (প্রথম) থ্রেড কিনা? ।
pid_t tid = syscall(SYS_gettid);
লিনাক্স আপনাকে কোনও থ্রেডের আইডি পেতে মঞ্জুরি দেয় এমন সিস্টেম কল সরবরাহ করে।
pthread_getthreadid_np
আমার ম্যাক ওএস এক্স এ ছিল না। pthread_t
একটি অস্বচ্ছ ধরণের। এটির উপর আপনার মাথা মারবেন না। কেবল এটিকে বরাদ্দ করুন void*
এবং এটি ভাল কল করুন। আপনি করার প্রয়োজন হলে printf
ব্যবহার %p
।
আমি মনে করি কেবল প্রশ্নটি পরিষ্কার নয়, তবে বেশিরভাগ লোকেরাও এই পার্থক্য সম্পর্কে সচেতন নন। নিম্নলিখিত উক্তিটি পরীক্ষা করুন,
পক্সিক থ্রেড আইডিগুলি লিনাক্স নির্দিষ্ট
gettid()
সিস্টেম কল দ্বারা ফেরত থ্রেড আইডিগুলির মতো নয় । থ্রেডিং বাস্তবায়ন দ্বারা পসিক্স থ্রেড আইডি নির্ধারিত এবং রক্ষণাবেক্ষণ করা হয়। ফেরত থ্রেড আইডিgettid()
হ'ল একটি নম্বর (প্রসেস আইডির অনুরূপ) যা কার্নেল দ্বারা বরাদ্দ করা হয়েছে। যদিও লিনাক্স এনপিটিএল থ্রেডিং বাস্তবায়নে প্রতিটি পসিক্স থ্রেডের একটি অনন্য কার্নেল থ্রেড আইডি রয়েছে, তবে কোনও অ্যাপ্লিকেশন সাধারণত কার্নেল আইডিগুলি সম্পর্কে জানার প্রয়োজন হয় না (এবং এটি জানার উপর নির্ভর করে পোর্টেবল হবে না)।এর থেকে উদ্ধৃত: লিনাক্স প্রোগ্রামিং ইন্টারফেস: একটি লিনাক্স এবং ইউনিক্স সিস্টেম প্রোগ্রামিং হ্যান্ডবুক, মাইকেল কেরিক
আইএমএইচও, কেবল একটি বহনযোগ্য পথ যা একটি কাঠামো পেরিয়ে যায় যার মধ্যে একটি চলক হোল্ডিং সংখ্যাকে একটি আরোহী পদ্ধতিতে সংজ্ঞায়িত করা হয় যেমন 1,2,3...
প্রতি থ্রেড পর্যন্ত। এটি করার মাধ্যমে থ্রেডের আইডি ট্র্যাক করা যায়। তবুও, int pthread_equal(tid1, tid2)
ফাংশন ব্যবহার করা উচিত।
if (pthread_equal(tid1, tid2)) printf("Thread 2 is same as thread 1.\n");
else printf("Thread 2 is NOT same as thread 1.\n");
gettid()
আসলে একটি ভাল পরামর্শ, আপনাকে ধন্যবাদ! যাইহোক, আমাকে এখানে সার্জি এল দ্বারা উত্তর অনুসরণ করা দরকার: stackoverflow.com/a/21280941/2430526
থ্রেড আইডি পাওয়ার আরও একটি উপায় রয়েছে। দিয়ে থ্রেড তৈরি করার সময়
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)
থ্রেড করার জন্য ফাংশনে প্রেরণ করা হয় ।
আপনি একাধিক আর্গুমেন্ট পাস করতে একটি কাঠামো তৈরি করতে পারেন এবং কোনও কাঠামোতে একটি পয়েন্টার পাঠাতে পারেন।
typedef struct thread_info {
pthread_t thread;
//...
} thread_info;
//...
tinfo = malloc(sizeof(thread_info) * NUMBER_OF_THREADS);
//...
pthread_create (&tinfo[i].thread, NULL, handler, (void*)&tinfo[i]);
//...
void *handler(void *targs) {
thread_info *tinfo = targs;
// here you get the thread id with tinfo->thread
}
আপনি এই পদ্ধতিতে লিখতে পারেন এবং এটি একই কাজ করে। যেমন:
for(int i=0;i < total; i++)
{
pthread_join(pth[i],NULL);
cout << "SUM of thread id " << pth[i] << " is " << args[i].sum << endl;
}
এই প্রোগ্রামটি pthread_t এর একটি অ্যারে সেট করে এবং প্রত্যেকটির জন্য যোগফল গণনা করে। সুতরাং এটি প্রতিটি থ্রেডের যোগফলকে থ্রেড আইডি দিয়ে মুদ্রণ করছে।
প্ল্যাটফর্ম-স্বতন্ত্র উপায় (সি ++ 11 থেকে শুরু):
#include <thread>
std::this_thread::get_id();
pthread_t
। একটি ম্যাকের মধ্যে যা পয়েন্টার এবং লিনাক্সে একটি পূর্ণসংখ্যা হবে। এটি top
উদাহরণস্বরূপ আপনি যে "নেটিভ" আইডিটি দেখতে পাবেন তা প্রতিফলিত করে না । কিছু সচেতন হতে হবে, তবে এটি কিছু ব্যবহারের জন্য জরিমানা।