يتصرف pthread_cancel بشكل مختلف على الذراع وقدرة لكل نقرة؟

StackOverflow https://stackoverflow.com/questions/637824

  •  10-07-2019
  •  | 
  •  

سؤال

أنا أعمل حاليًا على تطبيق متعدد الخيوط سيتم نشره على بنية الذراع والدفع لكل نقرة (PPC).أواجه بعض المشاكل مع pthread_cancel على الذراع.

لا يتصرف pthread_cancel الموجود على الذراع بنفس الطريقة مع قدرة الدفع لكل نقرة (PPC).يتم إلغاء مؤشر الترابط ولكن لا يتم استدعاء المدمر للمتغير المحلي لمؤشر الترابط على الذراع.لقد حاولت أيضًا تحديد روتين معالج تنظيف الإلغاء بشكل صريح عبر pthread_cleanup_push.ولكن لا يتم استدعاؤه عند إلغاء الموضوع.

الكود يعمل بشكل جيد مع PPC.عندما يتم إلغاء مؤشر ترابط، يتم استدعاء أداة إتلاف المتغير المحلي.وعندما قمت بتحديد معالج التنظيف بشكل صريح، تم استدعاؤه وتنفيذه عندما تم استدعاء pthread_cancel.

هل فاتني شيء؟ربما بعض خيارات المترجم؟

  • لغة برمجة:سي ++
  • المجمعون:ذراع لينكس-g++/powerpc-linux-g++
  • نظام التشغيل:لينكس

يحرر:

لقد وجدت نوعًا من المشاكل المماثلة التي تم تسجيلها في هذا خطأ libc.

إن استخدام gcc بدلاً من g++ وإضافة خيار المترجم -fno-exception قد أدى المهمة.لكني أريد حقًا أن أفهم الأشياء وراء هذه المشكلة.علاوة على ذلك، فإن -fno-exception يعني أنني لن أتمكن من تنفيذ معالجة الاستثناء في تطبيقي، لا يعني ذلك أنني أستخدمه الآن ولكن قد أكون كذلك في المستقبل.

شكرًا.

هل كانت مفيدة؟

المحلول

يعد إلغاء الموضوع دون مساعدة من التطبيق فكرة سيئة.فقط جوجل.من الأفضل أن تطلب من الخيط أن ينتهي من تلقاء نفسه عن طريق تعيين متغير إشارة يتم فحصه بشكل دوري بواسطة الخيط.

في الواقع، يعد الإلغاء أمرًا صعبًا للغاية لدرجة أنه تم حذفه من أحدث مسودة C++0x.يمكنك البحث http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html ولن تجد أي ذكر للإلغاء على الإطلاق.فيما يلي تعريف فئة الموضوع المقترحة (لن تجد إلغاء هناك):

class thread
{
public:
    // types:
    class id;
    typedef implementation-defined native_handle_type; // See [thread.native]

    // construct/copy/destroy:
    thread();
    template <class F> explicit thread(F f);
    template <class F, class ...Args> thread(F&& f, Args&&... args);
    ~thread();
    thread(const thread&) = delete;
    thread(thread&&);
    thread& operator=(const thread&) = delete;
    thread& operator=(thread&&);

    // members:
    void swap(thread&&);
    bool joinable() const;
    void join();
    void detach();
    id get_id() const;
    native_handle_type native_handle(); // See [thread.native]

    // static members:
    static unsigned hardware_concurrency();
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top