簡體   English   中英

純C ++中的多線程?

[英]Multi threading in pure C++?

讓我澄清一下,我知道c ++ 11中已添加了多線程支持。 但是,在此更新之前,只能在C ++中的Qt中完成多線程。 所以,

  1. Qt如何提供此功能而不是標准C ++?
  2. 人們如何對他們的“純” C ++(沒有像Qt,FLTK +這樣的庫)應用程序進行多線程處理? 我對使用MinGW編譯器的人感興趣。

Qt對不同的操作系統使用不同的線程庫。 例如,在Unix上,可以使用pthreads,而在Windows上,可以使用WinAPI支持(例如CreateThread函數)。

例如,Qt使用以下代碼在Unix系統上創建線程:

 int code =
    pthread_create(&d->thread_id, &attr, QThreadPrivate::start, this);

並在Windows系統上創建它:

 d->handle = (Qt::HANDLE) _beginthreadex(NULL, d->stackSize, QThreadPrivate::start,
                                        this, CREATE_SUSPENDED, &(d->id));

所有這些都使用預處理器進行包裝,因此正確的庫可用於正確的系統。 看一下qthread_p.h中的這段代碼,一切應該都清楚了:

#ifdef Q_OS_UNIX
    pthread_t thread_id;
    QWaitCondition thread_done;

    static void *start(void *arg);
#if defined(Q_OS_SYMBIAN)
    static void finish(void *arg, bool lockAnyway=true, bool closeNativeHandle=true);
#else
    static void finish(void *);
#endif

#endif // Q_OS_UNIX

#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
    HANDLE handle;
    unsigned int id;
    int waiters;

    static unsigned int __stdcall start(void *);
    static void finish(void *, bool lockAnyway=true);
#endif // Q_OS_WIN32

要回答您的問題:

  1. 已經回答。 C ++ 11實現中的線程支持以相同的方式實現(差別很小-gcc不需要支持Win32線程,如果僅為一個系統編寫pthread,Microsoft VC也不需要支持pthread。Qt是多平台的)庫,因此它需要包括對所有平台的支持)。

  2. 使用低級系統調用,例如( pthread_createCreateThread等)。

Qt如何提供此功能而不是標准C ++?

這類似於詢問Qt如何在C ++不提供該功能時提供顯示GUI窗口的功能。 Qt並不是純粹按照C ++標准庫來實現的。 Qt通過使用其他東西實現了根本上的新功能。

人們如何對他們的“純” C ++(沒有像Qt,FLTK +這樣的庫)應用程序進行多線程處理? 我對使用MinGW編譯器的人感興趣。

在C ++ 11之前,他們沒有。 他們必須使用其他庫,例如pthreads或特定於OS的庫。 實際上,在C ++ 11內存模型之前,根據規范,多線程程序都是“未定義行為”。

Qt唯一要做的就是根據平台使用不同的庫。 標准庫也是一組庫,但是具有針對所有平台的通用且指定良好的行為和接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM