C ++:线程之间共享静态函数成员,可以阻塞所有?

时间:2011-01-17 00:39:18

标签: c++ pthreads blocking

我有一个类,它定义了静态函数以使用C风格的extern C { static void callback(foo bar) { } }。 //静态在标题中定义。

从这个类中实例化三个对象(每个对象在单独的pthread中),每个对象都有自己的循环(在类构造函数中),它可以接收回调。

指向函数的指针传递为:

x = init_function(h, queue_id, &callback, NULL);
while(1) { loop_function(x); }

因此每个线程都有与&回调相同的指针。

  1. 回调功能可以阻止几分钟。
  2. 每个线程对象(不包括获得阻塞回调的对象)都可以再次调用回调。
  3. 如果回调函数只存在一次,那么任何试图回调的线程也会阻塞。这会给我一个不受欢迎的错误,大概有趣的是: C ++中的任何东西都可以这样做吗?也许,由于extern {}或一些指针用法?

3 个答案:

答案 0 :(得分:2)

C ++不了解线程。绝对没有什么会导致一个线程自动阻止另一个线程;您必须使用某些操作系统或库函数来完成此操作。对于任意数量的线程来说,同时调用单个函数是完全有效的。

答案 1 :(得分:2)

如果您没有专门编写某种锁或调用具有某种锁定功能的函数(包括系统函数)(比如打开同一个文件进行独占写访问等),那么就没有办法“阻止“其他线程。 c或c ++中没有自动锁定功能。

如果回调执行sleep(3600),则不会阻止其他线程。每个线程都会进入回调并执行sleep(3600)。

如果希望线程等待执行关键代码,则必须自己编写锁定机制的代码。您通常在执行代码之前激活锁定机制(通常称为“锁定”),然后通常在执行代码后停用锁定(“解锁”)。 Linux编码器通常使用互斥锁或gcc原子操作来执行此操作。

听起来像你需要阅读一些关于线程和多线程代码的基本文档,然后从那里开始。以下是关于线程基础知识的一百万篇文章之一:link text

答案 2 :(得分:1)

  

如果回调函数只存在一次,那么任何尝试回调的线程也会阻塞。这会给我一个不受欢迎的错误,大约有趣的问题是:C ++中的任何东西都可以这样做吗?也许,由于extern {}或一些指针使用?

不,是的。

callback是一个简单的功能。它可以(原则上)由两个线程并行调用,extern C不会对此进行任何更改。

但是,如果执行callback功能,例如。等待互斥锁,它肯定会阻止多个线程。