我有一个类,它定义了静态函数以使用C风格的extern C { static void callback(foo bar) { } }
。 //静态在标题中定义。
从这个类中实例化三个对象(每个对象在单独的pthread中),每个对象都有自己的循环(在类构造函数中),它可以接收回调。
指向函数的指针传递为:
x = init_function(h, queue_id, &callback, NULL);
while(1) { loop_function(x); }
因此每个线程都有与&回调相同的指针。
答案 0 :(得分:2)
C ++不了解线程。绝对没有什么会导致一个线程自动阻止另一个线程;您必须使用某些操作系统或库函数来完成此操作。对于任意数量的线程来说,同时调用单个函数是完全有效的。
答案 1 :(得分:2)
如果您没有专门编写某种锁或调用具有某种锁定功能的函数(包括系统函数)(比如打开同一个文件进行独占写访问等),那么就没有办法“阻止“其他线程。 c或c ++中没有自动锁定功能。
如果回调执行sleep(3600),则不会阻止其他线程。每个线程都会进入回调并执行sleep(3600)。
如果希望线程等待执行关键代码,则必须自己编写锁定机制的代码。您通常在执行代码之前激活锁定机制(通常称为“锁定”),然后通常在执行代码后停用锁定(“解锁”)。 Linux编码器通常使用互斥锁或gcc原子操作来执行此操作。
听起来像你需要阅读一些关于线程和多线程代码的基本文档,然后从那里开始。以下是关于线程基础知识的一百万篇文章之一:link text
答案 2 :(得分:1)
如果回调函数只存在一次,那么任何尝试回调的线程也会阻塞。这会给我一个不受欢迎的错误,大约有趣的问题是:C ++中的任何东西都可以这样做吗?也许,由于extern {}或一些指针使用?
不,是的。
callback
是一个简单的功能。它可以(原则上)由两个线程并行调用,extern C
不会对此进行任何更改。
但是,如果执行callback
功能,例如。等待互斥锁,它肯定会阻止多个线程。