我是一名java程序员,但目前正在研究c ++语言.与java不同,c ++没有定义任何线程实用程序.在c ++中实现多线程应用程序对我来说有点困难.无论如何有人可以用c ++实现自己的线程库吗?你必须掌握汇编语言的一些概念吗?我在很多场合试图从操作系统特定的功能创建一个线程,但我一直都失败了.有人可以帮忙吗?
鉴于您的专业水平,也许Boost Threads会有所帮助吗?
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
在回答您的其他问题时,您当然可以实现自己的线程库.不,您不需要知道任何汇编语言,但没有C标准库函数可以帮助您,您将需要使用特定于操作系统的库.例如,在Windows上使用beginthreadex CRT函数,该函数最终调用CreateThread Win32系统调用,但在许多unix上,您将使用pthread_create.
除了启动线程之外,您可能还需要一些同步原语,Boost库也可以在此前端提供.如果你想自己动手,在Windows上查看CreateMutex,WaitForSingleObject和ReleaseMutex或者CriticalSection函数,在unix上查看pthread_mutex_init.
我建议您使用现有的多平台库作为Boost,ACE,POCO,QT ......
ACE有很多线程类,最简单的使用可能是ACE_Task_Base.您继承它并提供int svc()方法的实现.这是激活线程时调用的方法.
class WorkerThread : public ACE_Task_Base { public: int svc() { ... } }; int main() { WorkerThread worker; worker.activate(); worker.wait(); }
使用POCO,您必须使用Runnable接口,其用法与Java线程的用法相近(如果您实现Runnable,而不是扩展Thread):
class Worker : public Poco::Runnable { ... }; int main() { Worker worker; Poco::Thread thr; thr.start( worker ); thr.join(); }
提升线程(推荐)有点不同.它不是实现/扩展接口,而是取决于正在定义的operator().您创建一个线程,传递一个实现operator()()的对象.该线程首先调用该方法.好的部分是与boost :: bind结合起来创建一个伪仿函数(实现operator()的对象)非常简单:
class X { public: void method( int argument ); } int main() { X x; boost::thread thr( boost::bind( &X::method, &x, 100 ) ); thr.join(); }
该片段将创建一个X类型的对象.使用bind,您可以创建一个函数,该函数包含对应用于对象x的方法X ::方法的调用,并将其作为方法参数传递100.
虽然这与Java的观点大不相同,但它也是最灵活的方法,因为您可以将线程模型与实际工作代码分离.无需适合特定的界面.这也是即将推出的标准线程接口.