[c++] مثال بسيط للخيوط في C ++


Answers

حسنا ، من الناحية الفنية أي كائن من هذا القبيل سوف ينتهي بناؤها عبر مكتبة مؤشر ترابط C- نمط لأن C ++ فقط حددت فقط نموذج std::thread في c + + + + ، الذي تم فقط مسمر ولم يتم تنفيذه بعد. المشكلة هي نظامية إلى حد ما ، فنموذج ذاكرة c ++ الموجود ليس صارماً بما يكفي للسماح بدلالات محددة جيداً لكل الحالات "التي تحدث قبل". كتب هانز بوهم ورقة حول هذا الموضوع منذ فترة طويلة ، وكان له دور فعال في التوصل إلى معيار c ++ 0x في هذا الموضوع.

http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html

وقال أن هناك عدة مكتبات C ++ موضوع عبر منصة التي تعمل على ما يرام في الممارسة العملية. تحتوي كتل الإنشاء مؤشر ترابط Intel على كائن مؤشر ترابط tbb :: يقترب بشكل كبير c ++ 0x القياسي و Boost يحتوي على مكتبة boost :: thread يفعل نفس.

http://www.threadingbuildingblocks.org/

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

باستخدام boost :: thread يمكنك الحصول على شيء من هذا القبيل:

#include <boost/thread.hpp>

void task1() { 
    // do stuff
}

void task2() { 
    // do stuff
}

int main (int argc, char ** argv) {
    using namespace boost; 
    thread thread_1 = thread(task1);
    thread thread_2 = thread(task2);

    // do other stuff
    thread_2.join();
    thread_1.join();
    return 0;
}
Question

يمكن للشخص نشر مثال بسيط على بدء اثنين (المواضيع الموجه) في C ++.

أنا أبحث عن كائنات مؤشر الترابط C ++ الفعلية التي يمكنني توسيع أساليب تشغيل على (أو شيء مماثل) بدلاً من استدعاء مكتبة مؤشر ترابط C- نمط.

تحديث - لقد استبعدت أي طلبات خاصة بنظام التشغيل على أمل أن يرد أي شخص أجاب بواسطة مكتبات الأنظمة الأساسية لاستخدامها. أنا فقط أقوم بهذا الوضوح الآن.




عند البحث عن مثال لفئة C ++ تستدعي إحدى طريقتها الخاصة بها في سلسلة محادثات جديدة ، يظهر هذا السؤال ، لكننا لم نتمكن من استخدام أي من هذه الإجابات بهذه الطريقة. إليك مثال يفعل ذلك:

Class.h

class DataManager
{
public:
    bool hasData;
    void getData();
    bool dataAvailable();
};

Class.cpp

#include "DataManager.h"

void DataManager::getData()
{
    // perform background data munging
    hasData = true;
    // be sure to notify on the main thread
}

bool DataManager::dataAvailable()
{
    if (hasData)
    {
        return true;
    }
    else
    {
        std::thread t(&DataManager::getData, this);
        t.detach(); // as opposed to .join, which runs on the current thread
    }
}

لاحظ أن هذا المثال لا يدخل في كائن المزامنة أو القفل.




يعتمد إلى حد كبير على المكتبة التي تقرر استخدامها. على سبيل المثال ، إذا كنت تستخدم مكتبة wxWidgets ، فسيبدو إنشاء سلسلة المحادثات كما يلي:

class RThread : public wxThread {

public:
    RThread()
        : wxThread(wxTHREAD_JOINABLE){
    }
private:
    RThread(const RThread &copy);

public:
    void *Entry(void){
        //Do...

        return 0;
    }

};

wxThread *CreateThread() {
    //Create thread
    wxThread *_hThread = new RThread();

    //Start thread
    _hThread->Create();
    _hThread->Run();

    return _hThread;
}

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




Links