ในโปรแกรม linux c วิธีพิมพ์ thread id ของเธรดที่สร้างโดย pthread library?
เช่น: เราสามารถรับ pid ของกระบวนการโดยgetpid()
ในโปรแกรม linux c วิธีพิมพ์ thread id ของเธรดที่สร้างโดย pthread library?
เช่น: เราสามารถรับ pid ของกระบวนการโดย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
. จำเป็นต้องใช้สำหรับโปรเจ็กต์ดังนั้นจำเป็นต้องตรวจสอบความน่าเชื่อถือของ API นั้นในแพลตฟอร์ม iOS และ OSX อ้างอิงลิงค์ที่opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.hแต่ไม่แน่ใจว่าเป็นลิงค์ที่ถูกต้องหรือไม่
_np
หมายถึงไม่พกพา ลินุกซ์มีของตัวเอง_np
สิ่งที่ pthread_getthreadid_np
แต่จะไม่รวมถึงแอปเปิ้ล
อะไร? บุคคลนั้นขอเฉพาะ Linux และเทียบเท่ากับ getpid () ไม่ใช่ BSD หรือ Apple คำตอบคือ gettid () และส่งกลับประเภทอินทิกรัล คุณจะต้องเรียกมันโดยใช้ syscall () ดังนี้:
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
แม้ว่าสิ่งนี้อาจไม่สามารถพกพาไปยังระบบที่ไม่ใช่ linux ได้ แต่ threadid นั้นเทียบได้โดยตรงและรวดเร็วมากในการรับ สามารถพิมพ์ได้ (เช่นสำหรับ LOG) เหมือนจำนวนเต็มปกติ
getpid()
ได้ให้เป็นตัวอย่าง มันไม่ได้บอกว่าความหมายเป็นข้อกำหนดที่ยาก การทำให้ผู้คนตระหนักถึงการทำสิ่งต่างๆด้วยวิธีที่เข้ากันได้กับ POSIX ดังนั้นชุมชนอื่น ๆ นอกเหนือจาก Linux (เช่น FreeBSD, Illumos, OS X ฯลฯ ) จะได้รับประโยชน์จากสิ่งเหล่านี้ไม่ใช่การ "อวด" อย่างที่ฉันบอกว่าฉันเดาว่า Linux กลายเป็น Windows ตัวต่อไปแล้ว
ดังที่ระบุไว้ในคำตอบอื่น ๆ pthreads ไม่ได้กำหนดวิธีที่ไม่ขึ้นกับแพลตฟอร์มในการดึง ID เธรดอินทิกรัล
บนระบบ Linux คุณสามารถรับ thread ID ได้ดังนี้:
#include <sys/types.h>
pid_t tid = gettid();
บนแพลตฟอร์มที่ใช้ BSD จำนวนมากคำตอบนี้https://stackoverflow.com/a/21206357/316487เป็นวิธีที่ไม่พกพา
อย่างไรก็ตามหากเหตุผลที่คุณคิดว่าคุณต้องการ ID เธรดคือการทราบว่าคุณกำลังรันบนเธรดเดียวกันหรือต่างกันกับเธรดอื่นที่คุณควบคุมคุณอาจพบยูทิลิตี้บางอย่างในแนวทางนี้
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);
Linux จัดเตรียมการเรียกระบบดังกล่าวเพื่อให้คุณได้รับ id ของเธรด
คุณสามารถใช้ได้ pthread_self()
ผู้ปกครองได้รับทราบด้าย id หลังจากที่pthread_create()
ถูกดำเนินการสำเร็จ แต่ในขณะที่การดำเนินด้ายถ้าเราต้องการที่จะเข้าถึงด้าย id pthread_self()
ที่เราต้องใช้ฟังก์ชั่น
บรรทัดเดียวนี้ให้ pid แต่ละ threadid และ spid
printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
pthread_getthreadid_np
ไม่ได้อยู่บน Mac os x ของฉัน pthread_t
เป็นชนิดทึบแสง อย่าทุบหัวของคุณ เพียงแค่กำหนดให้void*
และเรียกว่าดี หากคุณจำเป็นต้องใช้ printf
%p
ฉันคิดว่าไม่เพียง แต่คำถามจะไม่ชัดเจน แต่คนส่วนใหญ่ยังไม่ตระหนักถึงความแตกต่าง ตรวจสอบคำพูดต่อไปนี้
รหัสเธรด POSIX ไม่เหมือนกับ ID เธรดที่ส่งคืนโดยการ
gettid()
เรียกระบบเฉพาะของ Linux รหัสเธรด POSIX ถูกกำหนดและดูแลโดยการใช้เธรด ID เธรดที่ส่งกลับgettid()
เป็นตัวเลข (คล้ายกับ ID กระบวนการ) ที่กำหนดโดยเคอร์เนล แม้ว่าแต่ละเธรด POSIX จะมีรหัสเคอร์เนลเธรดที่ไม่ซ้ำกันในการใช้เธรด Linux NPTL แต่โดยทั่วไปแอปพลิเคชันไม่จำเป็นต้องรู้เกี่ยวกับรหัสเคอร์เนล (และจะไม่สามารถพกพาได้หากขึ้นอยู่กับการรู้จัก)ตัดตอนมาจาก: ส่วนต่อประสานการเขียนโปรแกรม Linux: คู่มือการเขียนโปรแกรมระบบ Linux และ UNIX, Michael Kerrisk
IMHO มีวิธีแบบพกพาเพียงวิธีเดียวที่ส่งผ่านโครงสร้างที่กำหนดตัวแปรการถือครองตัวเลขในลักษณะจากน้อยไปมากเช่น1,2,3...
ต่อเธรด การทำเช่นนี้จะสามารถติดตาม id ของเธรดได้ อย่างไรก็ตาม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()
เป็นจริงเป็นคำแนะนำที่ดีขอขอบคุณ! อย่างไรก็ตามฉันต้องทำตามคำตอบของ Sergey L. ที่นี่: 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
คือ id เธรด (นั่นคือ int long ที่ไม่ได้ลงชื่อที่กำหนดไว้ในบิต / pthreadtypes.h) นอกจากนี้อาร์กิวเมนต์สุดท้าย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 และคำนวณผลรวมของแต่ละรายการ ดังนั้นจึงเป็นการพิมพ์ผลรวมของแต่ละเธรดด้วยรหัสเธรด
วิธีที่ไม่ขึ้นกับแพลตฟอร์ม (เริ่มจาก c ++ 11) คือ:
#include <thread>
std::this_thread::get_id();
pthread_t
ไฟล์. บน Mac ที่จะเป็นตัวชี้และบน Linux เป็นจำนวนเต็ม นอกจากนี้ยังไม่แสดงรหัส "เนทีฟ" ที่คุณอาจเห็นtop
ตัวอย่างเช่น สิ่งที่ควรระวัง แต่อาจใช้ได้ดีสำหรับการใช้งานบางอย่าง