تعزيز :: this_thread :: get_id () دون عملية السلسلة

أنا في حالة حيث كنت بحاجة للحصول على boost :: thread :: id في متغير ، لكن هذا المتغير ليس سلسلة ، ولا يسمح بتشغيل سلسلة. هل هذا ممكن؟

ربما شيء من هذا القبيل

char * tid = (casting something) boost :: this_thread :: get_id()

هذا هو c ++ على نظام يونيكس. سبب تجنب استخدام عملية السلسلة لأنه يبطئ سرعة التطبيق بالكامل. شكرا من قبل.

2
تذكر أن التحسين المبكر هو أصل كل الشرور. هل أنت متأكد من أن استخدام سلسلة العمليات هنا سيؤثر بشكل ملحوظ على أدائك؟
وأضاف المؤلف Björn Pollex, مصدر
هل أنت متأكد من سلاسل بطيئة؟ هل قمت بتوصيفها؟
وأضاف المؤلف rve, مصدر

2 إجابة

في أي حال ، يبدو أن سؤالك يستند كلية إلى مفهوم خاطئ. إذا كنت ترغب في الحصول على boost :: thread :: id في متغير ، فيجب أن يكون المتغير من النوع boost :: thread :: id . مثله:

boost::thread::id MyVariable = boost::thread::get_id();

يتم تضمين أي سلاسل على الإطلاق. لماذا تحاول إرسالها إلى char * ؟

إذا كانت مؤشرات الترابط الخاصة بك تحتاج إلى الحصول على أرقام التعريف الخاصة بهم في كثير من الأحيان حتى أنها تخلق عنق الزجاجة ، فمن المحتمل أن تقوم بشيء خاطئ بشكل فظيع. لماذا تحتاج معرف الخيط كثيرا؟

Update: Okay, so you need a thread ID that has specific semantics. You need to assign threads IDs that have the semantics you require. (There is no guarantee that whatever ID the threads already have is usable in a file name.) In pseudo-code:

  1. الاتصال get_id.
  2. ابحث عن الرقم التعريفي الذي استردته في الخريطة.
  3. إذا عثرت على إدخال لهذا المعرف ، فأرجع قيمته ، وبذلك تكون قد انتهيت.
  4. لا يحتوي مؤشر الترابط هذا على معرف يمكن استخدامه في اسم الملف. لذا احدده واحدًا. قم بتخزين زوج المعرف الذي حصلت عليه من get_id والمعرف الذي قمت بتعيينه للتو في الخريطة. سيضمن هذا في المرة التالية التي تحاول فيها الحصول على إدخال لهذا الموضوع ، سوف تحصل على نفس الموضوع.

بدلا من ذلك ، قد يكون النظام الأساسي الخاص بك يحتوي على وظيفة توفر الدلالات التي تحتاج إليها. على سبيل المثال ، يحتوي Linux gettid و NT GetCurrentThreadId .

6
وأضاف
أريد إنشاء ملف تمة الذي يستند إلى اسم معرف مؤشر الترابط. وبشكل أساسي ، سيكون اسم ملف tmp شيئًا مثل TRHEADID_file.txt ، ويتم استرداد الهوية مرة واحدة فقط ، في بداية الشفرة.
وأضاف المؤلف user777305, مصدر

ماذا عن:

std::ostringstream oss;
oss << boost::thread::get_id();
std::string idAsString = oss.str();

See the documentation on boost::thread::id

تحديث: نظرًا لأنك تستخدم الدفعة بالفعل ، فلماذا لا تستخدم:

std::string id = boost::lexical_cast(boost::thread::get_id());

أيضا ، لأنك تفعل هذا فقط في بداية السرعة لا ينبغي أن يكون مشكلة.

4
وأضاف