如何在类中创建线程?

时间:2009-04-21 06:35:47

标签: multithreading oop programming-languages

我们编程时是否有可用于创建线程的模板 OO语言?

如何为OO语言设计线程包?

7 个答案:

答案 0 :(得分:3)

支持

C ++ 0x将支持standard library中的线程。

截至目前,每个平台都有自己的线程实现方式(WindowsPOSIX),但您可以使用boost::thread这样的内容,而不必担心特定于平台的问题东西。

在Java中,有一个Thread class

方法

通常,要将类放入另一个线程,您将在将该类传递给线程时创建一个线程。然后线程将调用该类中的函数。这是一些伪C ++ - 代码:

main()
{
    Object myObject;

    thread = CreateThread(threadFunction, myObject);

    thread.join(); // wait for thread
}

threadFunction(Object theObject)
{
    theObject.doSomething();
}

这一切都通过在C ++中使用boost(或C ++ 0x线程)来简化,Java中的Thread类为您处理这个问题。

相关信息

线程应用程序中的一个大问题是线程同步。这包括race conditionsdeadlocks等问题,仅举几个例子。

存在帮助解决这些问题的方法/对象,例如mutex。一个线程可以锁定互斥锁,并且在原始线程释放互斥锁之前,将阻止尝试锁定互斥锁的任何其他线程。

semaphore是一个通用的互斥锁。

Eric的帖子中列出了其他有用的概念。

答案 1 :(得分:2)

每个框架都有自己的处理线程的方法。我建议你在java文档中查找java thread类,然后查看C ++标准头文件中的线程详细信息。

答案 2 :(得分:1)

每种编程语言都有特定的处理线程的方法。

C++ relies a lot on Boost所以你可能想检查那个

Java

基本上,您学习并发的一切都应该适用于您正在使用的操作系统或语言。你必须学会​​避免大约4个问题

  • 死锁
  • 活锁
  • 比赛条件
  • 饥饿

这与您的问题没有直接关系,但这些是您应该在学习特定语言的特定语法的同时学习的科目。 Java当然很容易,而C ++可能有点棘手,你的选择

还有许多用于同步线程的“众所周知的方法”,例如

  • 活动
  • 监视器
  • 互斥
  • 信号量
  • ...

这个列表一直在继续,但基本上是帮助“对象”或变量来帮助你解决提到的4个问题

答案 3 :(得分:1)

在C / C ++中,线程通常使用函数实现。 (“启动一个新线程并在内部运行此函数,在函数结束时销毁该线程。”)

线程框架通常允许将参数传递给函数。使用线程执行OO的一种方法是将对象指针(“this”)作为函数参数传递,然后在对象上调用特定方法。

答案 4 :(得分:0)

如果您正在使用MFC,那么MFC提供了一些框架帮助程序API来处理多线程。看看这篇文章:Multithreading with C++ and MFC

答案 5 :(得分:0)

在Java中,您可以使用Thread类或Executor接口,您可以向其发送可运行对象。查看java.util.concurrent package。和concurrency trail of the Java Tutorial.祝你好运。

答案 6 :(得分:0)

OOP和多线程编程的主要区别在于,您希望新线程将其启动函数作为对象的(非静态)方法。

现在有一些编程模型:实现“Runnable”接口是最常用的接口。您的类实现了一个标准的“Runnable”接口,该接口具有一个启动方法,该方法通常是一个名为“run”的虚方法。您将启动代码放在该虚方法中,当您需要生成一个线程时,您创建一个线程对象(通常称为Thread),并向您传递一个实现“Runnable”接口的类的对象。然后你调用那个“Thread”对象的“start”方法,这将关注你在类中编写的启动代码将运行一个新线程。在此示例中,“Runnable”和“Thread”均由所选的线程库或您选择的编程语言的标准库/框架提供。另请注意,这两个类的名称可能有所不同。

在多线程编程方面,C ++和Java之间存在很大差异:C ++不支持多线程,而Java则支持多线程。

因此,对于C ++,您需要使用专门的线程库,如Pthreads(http://en.wikipedia.org/wiki/POSIX_Threads)或更多通用库,如Boost,ACE,POCO,它们已经支持线程。建议最少的方法是直接调用操作系统的多线程相关服务。

对于Java,无论您使用的是哪个版本,都将支持内置的多线程编程。