Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
纯C++中的多线程技术?_C++_Multithreading_Qt_C++11_Mingw - Fatal编程技术网

纯C++中的多线程技术?

纯C++中的多线程技术?,c++,multithreading,qt,c++11,mingw,C++,Multithreading,Qt,C++11,Mingw,让我澄清一下,我知道c++11中添加了多线程支持。 但是在这个更新之前,多线程只能在C++中进行QT。所以 QT如何提供这个功能而不是标准C++? 人们如何将他们的“纯”C++无库,比如QT,FLTK+应用程序? 我对使用MinGW编译器的人感兴趣。 Qt为不同的操作系统使用不同的线程库。例如,在Unix上,您可以使用pthreads,在Windows上,您可以使用WinAPI支持,比如CreateThread函数 例如,Qt使用以下代码在Unix系统上创建线程: int code =

让我澄清一下,我知道c++11中添加了多线程支持。 但是在这个更新之前,多线程只能在C++中进行QT。所以

QT如何提供这个功能而不是标准C++? 人们如何将他们的“纯”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
回答您的问题:

已经回答了。C++11实现中的线程支持是以相同的方式实现的,但有一点不同——gcc不需要支持Win32线程,如果只为一个系统编写pthread,则Microsoft VC也不需要支持pthread。Qt是多平台库,因此它需要包括对所有平台的支持

使用诸如pthread_create、CreateThread等低级系统调用


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
回答您的问题:

已经回答了。C++11实现中的线程支持是以相同的方式实现的,但有一点不同——gcc不需要支持Win32线程,如果只为一个系统编写pthread,则Microsoft VC也不需要支持pthread。Qt是多平台库,因此它需要包括对所有平台的支持

使用诸如pthread_create、CreateThread等低级系统调用


Qt所做的唯一一件事就是根据平台使用不同的库。标准库也是一组库,但是对于所有平台都有一个共同的、指定良好的行为和接口。

Qt唯一做的事情就是根据平台使用不同的库。标准库也是一组库,但是对于所有平台都有一个通用的、指定良好的行为和接口

< Q>如何提供这个功能而不是标准C++? <>这类似于询问Qt如何提供在C++没有提供功能的情况下显示GUI窗口的能力。QT不是纯粹按照C++标准库实现的;Qt通过使用其他东西实现了基本的新功能

人们如何将他们的“纯”C++没有像QT、FLTK+应用程序那样的库?我对使用MinGW编译器的人感兴趣

在C++11之前,他们没有这样做。他们必须使用其他库,如pthreads或操作系统特定的库。事实上,根据规范,在C++11内存模型之前,多线程程序都是“未定义的行为”

< Q>如何提供这个功能而不是标准C++? <>这类似于询问Qt如何提供在C++没有提供功能的情况下显示GUI窗口的能力。QT不是纯粹按照C++标准库实现的;Qt通过使用其他东西实现了基本的新功能

人们如何将他们的“纯”C++没有像QT、FLTK+应用程序那样的库?我对使用MinGW编译器的人感兴趣


在C++11之前,他们没有这样做。他们必须使用其他库,如pthreads或操作系统特定的库。事实上,根据规范,在C++11内存模型之前,多线程程序都是“未定义的行为”。

嗨,Nemanja,感谢您的及时回复!现在我了解到Qt使用操作系统中的库来实现多线程。那么在C++11中也会发生同样的事情吗?@Cool_Coder是的,标准库需要使用不同的、特定于操作系统的调用来支持不同系统上的线程。是的,C++11将把提供由本机操作系统库支持的线程库的责任推给实现者,如果我在使用MinGW编译的纯C++11应用程序中使用多线程,我现在必须使用include操作系统特定的头。现在,最终的目标会自动在运行时获取所需的OS库依赖,或者我必须将它们与我的应用程序一起传送?在我过去的经验中,MinGW在没有发送MS C++重新分配表的情况下工作得很好。但这仅仅意味着WindowsXP的构建应该在Windows7上运行,而Windows8或反之亦然

仍然需要在Linux或OSX上编译才能在其他操作系统上工作。嗨,Nemanja,谢谢你的及时回复!现在我了解到Qt使用操作系统中的库来实现多线程。那么在C++11中也会发生同样的事情吗?@Cool_Coder是的,标准库需要使用不同的、特定于操作系统的调用来支持不同系统上的线程。是的,C++11将把提供由本机操作系统库支持的线程库的责任推给实现者,如果我在使用MinGW编译的纯C++11应用程序中使用多线程,我现在必须使用include操作系统特定的头。现在,最终的目标会自动在运行时获取所需的OS库依赖,或者我必须将它们与我的应用程序一起传送?在我过去的经验中,MinGW在没有发送MS C++重新分配表的情况下工作得很好。但这仅仅意味着Windows XP的构建应该在Windows 7上运行,而Windows 8或Windows 7上运行,你仍然需要在Linux或OSX上编译它才能在其他操作系统上运行。谢谢你的回答。根据规范,在C++11内存模型之前,多线程程序都是“未定义的行为”。你能解释一下吗?C++内存模型使多线程程序具有未定义的行为?@在C++ 11之前,MUC33637的C++内存模型没有定义从多个线程访问的对象的行为,因此这样做的行为是未定义的。因此,C++规范对任何程序都没有任何要求。感谢这个答案。在C++ 11内存模型之前,多线程程序都是根据规范的“未定义行为”。你能解释一下吗?C++内存模型使多线程程序具有未定义的行为?@在C++ 11之前,MUC33637的C++内存模型没有定义从多个线程访问的对象的行为,因此这样做的行为是未定义的。因此,C++规范对任何程序都没有任何要求。谢谢您的回答!酷酷的程序员我很高兴能帮到你:,但请避免这样的评论:。如果一个答案对你有用,请投赞成票,谢谢你的回答@酷酷的程序员我很高兴能帮到你:,但请避免这样的评论:。如果一个答案对你有用,请投赞成票。