首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将"this“传递给线程c++

将"this“传递给线程c++
EN

Stack Overflow用户
提问于 2011-10-18 03:00:30
回答 3查看 422关注 0票数 1

在C++中执行以下操作的最佳方式是什么?虽然我目前的方法有效,但我不确定这是最好的方法:

1)我有一个主类,里面有一些函数

2)我有一个线程,它接受套接字上的一些指令,然后运行主类中的一个函数

3)有许多线程可以访问主类中的各种函数

我创建了主类,然后从主类创建了线程类的实例。线程类的构造函数被传递给主类的"this“指针。然后,我可以在线程内的主类中运行函数-例如,我得到一个命令来做一些事情,从线程中运行主类中的函数。我有互斥体的etc来防止竞争问题。

我是不是走错了路-似乎线程类应该继承主类,或者另一种方法是没有单独的线程类,而只是将它们作为主类的函数,但这会变得很丑陋。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-18 04:11:36

我觉得不错。在我的服务器中,它被称为“SCB”-- ServerControlBlock --它提供了对服务的访问,比如In缓冲区/套接字池,记录器,状态/错误消息的UI访问,以及所有处理程序线程需要通用的任何其他东西。运行得很好,我不认为这是一个黑客行为。

在创建使用SCB的线程池之前,我创建了SCB (并在ctor中确保通过它访问的所有服务都已启动并准备好使用)-没有讨厌的单件东西。

Rgds,Martin

票数 1
EN

Stack Overflow用户

发布于 2011-10-18 03:04:19

单独的线程类是很正常的,特别是当它们有特定的功能时。我不会从主线程继承。

票数 1
EN

Stack Overflow用户

发布于 2011-10-18 03:31:05

this指针传递给线程本身并不是坏事。你可以用它做什么。

this指针与任何其他POD-ish数据类型一样。这只是一小块比特。然而,this中的东西可能不仅仅是PODs,而且由于所有常见的原因,传递实际上是指向它的成员的指针可能是危险的。任何时候你在线程之间共享任何东西,都会引入潜在的竞争条件和死锁。当然,解决这些冲突的基本方法是以互斥锁、信号量等形式引入同步,但这可能具有序列化应用程序的惊人效果。

假设您有一个线程从套接字读取数据并将其存储到同步命令缓冲区,另一个线程从该命令缓冲区读取数据。这两个线程使用相同的互斥锁来保护缓冲区。一切都很好,对吧?

好吧,也许不是。如果您不注意如何锁定缓冲区,您的线程可能会被序列化。假设您为buffer-insert和buffer-remove代码创建了单独的线程,以便它们可以并行运行。但是,如果您在每次插入和每次删除时都锁定缓冲区,那么一次只能执行其中一个操作。只要你写到缓冲区,你就不能从它读取,反之亦然。

您可以尝试对锁进行微调,使其尽可能简短,但只要您拥有共享的、同步的数据,就会有一定程度的序列化。

另一种方法是显式地将数据传递给另一个线程,并尽可能多地删除数据共享。例如,您的套接字代码可能会在堆上创建某种类型的Command对象(例如Command* cmd = new Command(...);),然后将其传递给另一个线程,而不是像上面那样写入和读取缓冲区。(在Windows中,一种方法是通过QueueUserAPC机制)。

这两种方法各有优缺点。同步方法的优点是在表面上更容易理解和实现,但潜在的缺点是,如果你搞砸了什么,调试起来就会困难得多。传递方法可能会使同步所固有的许多问题变得不可能(从而实际上使其变得更简单),但它需要时间在堆上分配内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7798237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档