[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- نمط.

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




يعتمد إلى حد كبير على المكتبة التي تقرر استخدامها. على سبيل المثال ، إذا كنت تستخدم مكتبة 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




عند البحث عن مثال لفئة 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
    }
}

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