- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经搜索了很多小时来寻找解决方案,但找不到简单的答案。我有一个类,它使用 pthreads。实际的函数指针在类中是静态的,我需要锁定互斥体,因为到目前为止我得到了“奇怪”的结果(参数未正确传递)。
然而,pthread_mutex_lock 和 unlock 不会在给定线程的函数内工作,因为它在静态成员函数中,但我不能拥有非静态函数,因为它不会在类内部工作,而且我无法移动它在类之外,因为它将无法访问所需的信息。
下面的代码应该解释一下:
class Fight{
pthread_mutex_t thread_mutex;
static void *thread_run_fighter(void *temp);
public:
Fight();
bool thread_round(Individual &a, int a_u, Individual &b, int b_u);
std::vector<Individual> tournament();
};
和cpp文件:
Fight::Fight(){
thread_mutex = PTHREAD_MUTEX_INITIALIZER;
}
bool Fight::thread_round(Individual &a, int a_u, Individual &b, int b_u){
if (a.saved and b.saved){
a.uniform = a_u;
b.uniform = b_u;
Individual *one = &a;
Individual *two = &b;
pthread_t a_thread, b_thread;
int a_thread_id, b_thread_id;
a_thread_id = pthread_create(&a_thread,NULL,Fight::thread_run_fighter,(void*) one);
b_thread_id = pthread_create(&b_thread,NULL,Fight::thread_run_fighter,(void*) two);
pthread_join( a_thread, NULL);
pthread_join( b_thread, NULL);
return true;
}
else{
return false;
}
}
void *Fight::thread_run_fighter(void *temp){
Individual *indiv;
indiv = (class Individual*)temp;
pthread_mutex_lock( &thread_mutex );
indiv->execute(indiv->uniform);
pthread_mutex_unlock( &thread_mutex );
}
如果有人能对此有所启发,我将不胜感激。我已经被困了几个小时了,我找不到任何信息。谢谢!
最佳答案
“不起作用”我假设你的意思是它不会编译,因为你试图在 static
成员函数中使用实例成员。
但更大的问题是您为什么要为此使用线程?
无论如何,您拥有的线程函数完全受互斥量保护 - 您只需调用
即可获得相同(或更好)的性能a.execute(a.uniform);
b.execute(b.uniform);
而不是启动线程然后等待它们完成。
但是如果您真的想使用线程(也许您正在学习它们)并且您希望您的静态成员函数能够处理实例成员,这里有一些建议。要让它工作,您需要以某种方式将 Fight 对象的实例传递给 static
线程函数:
// somewhere in `class Fight` definition:
//
// a structure that will let you pass a Fight* instance pointer
// along with an Individual* to work on in the the
// thread function
struct context {
Fight* me;
Individual* indiv;
};
// ...
// in Fight::thread_round():
// package up data to pass to the thread function
context one = {this, &a }; // instead of Individual *one = &a;
context two = {this, &b }; // instead of Individual *two = &b;
最后,Fight::thread_run_fighter()
:
void *Fight::thread_run_fighter(void *temp)
{
// pull out the Fight object instance and the Individual
// object to work on
context* ctx = (context*) temp;
Individual *indiv = ctx->indiv;
Fight* me = ctx->me;
// do the work (in a pretty serialized fashion, unfortunately)
pthread_mutex_lock( &me->thread_mutex );
indiv->execute(indiv->uniform);
pthread_mutex_unlock( &me->thread_mutex );
return 0;
}
关于c++ - 如何在类中使用 pthread_mutex 及其函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6119664/
我不明白为什么在这段代码中我遇到了死锁。我已经定义了这个互斥体: 互斥锁3:= 0(锁定) 互斥锁2:= 1(解锁) 我有 2 个进程:父亲和儿子。每个线程都有 N 个线程,我通过参数传递这些线程。子
我有以下代码: bool Mutex::timed_lock(unsigned long milliseconds) { if (!milliseconds) { re
问题背景 有问题的代码与 C++ 实现有关。我们有代码库,其中对于某些关键实现,我们使用 asm volatile ("mfence":"memory")。 我对内存障碍的理解是—— 用于确保指令集的
在使用 pthread_mutex_t 之前,应该调用 pthread_mutex_init(),在不再需要它之后,应该使用 pthread_mutex_destroy() 销毁它。 我的问题是,如果
使用 pthreads 在获得锁之前必须在任何互斥体上调用 pthread_mutex_init()。 根据 POSIX,锁定未初始化的互斥量仅针对具有优先级保护的互斥量 (opengroup : p
我目前正在阅读操作系统:三篇简单的文章,我开始了解并发背后的逻辑。在第 26 个“章节”中,我们得到了这个线程示例和围绕原子性的问题: #include #include #include st
我已经搜索了很多小时来寻找解决方案,但找不到简单的答案。我有一个类,它使用 pthreads。实际的函数指针在类中是静态的,我需要锁定互斥体,因为到目前为止我得到了“奇怪”的结果(参数未正确传递)。
我目前正在尝试使用 pthread_mutex 模型在 Linux 中同步两个进程。 这是我正在处理的代码: #include #include #include #include using
我正在尝试在 Linux 中使用基于健壮的 futex 的 pthread 互斥体,因为我需要既快速又健壮(恢复“死”锁)。我如何检查任何 Linux 系统上的 pthread 互斥库是否基于健壮的
我尝试在 pthread_mutex 上创建一个包装器,该包装器维护当前线程持有的所有互斥锁的列表。但是,我也使用了某些库代码,对此我不可能使用这个包装器。有什么办法可以得到这个通用 pthread_
我用 C 和 Java 编写了完全相同的程序,其中两个线程递增全局计数器。为了确保 C 中计数器访问的排他性,使用了 pthread_mutex_t,而在 Java 中则使用 synchronized
在 pthread_mutex_init 等接口(interface)的手册页中, int pthread_mutex_init(pthread_mutex_t *restrict mutex,
根据手册页 pthread_mutex_lock locks the given mutex. If the mutex is currently unlocked, it becomes locke
boost::details::pool::pthread_mutex 和 boost::details::pool::null_mutex 有什么区别。 我看到在最新的 boost 版本 - 1.4
我现在正在学习多线程编程,我注意到使用互斥锁实现同步的程序在 Mac OS X 上非常慢,在某种程度上通常最好使用单线程。我知道有更快的同步方式,但我仍然想知道为什么会这样。为了简单的时间测量,我写了
我是一名优秀的程序员,十分优秀!