我正在编写一个Java程序,它与我的Linux服务器上的一个C程序(一个客户机/服务器聊天程序)接口。现在,我正在实现一个阻塞功能,用于阻塞输入,直到用户在将输入发送到服务器之前按下"Enter“。为此,我有两个选择:繁忙循环和互斥。互斥显然是最好的选择,但我遇到了一个问题,有时输入根本不会发送到服务器。不过,在繁忙循环中,我只需取消设置一个标志,它就能正常工作。 忙循环: while(!this.inputField.isReady()){}
// send data in inputField to server
this.inputField.setReady(false);
我有一个多线程应用程序挂起了对_dl_sysinfo_int80()的调用。根据gdb的说法,所有线程都被阻塞在这个调用中。
堆栈跟踪的顶部如下所示:
#0 0x002727a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1 0x004f23de in __lll_mutex_lock_wait () from /lib/tls/libpthread.so.0
#2 0x004ef00b in _L_mutex_lock_35 () from /lib/tls/libpthread.so.0
#3 0x092828ac in co
我想知道是否有可能在Linux下使用POSIX线程库实现以下逻辑。
given a mutex
if (I can get the mutex) {
lock the mutex
call fun A
unlcok the mutex
}
else {
call fun B
}
我是Linux下的线程编程新手,所以只需使用伪代码来显示我正在寻找的代码片段的逻辑即可。
给定线程TA和TB在下面的f()中竞争:
struct C {
C(): a(0) {}
int a;
std::mutex mtx;
void f() {
... // use 'a' in readonly mode
std::lock_guard<std::mutex> lock(mtx); // assume TA gets the lock first, then TB
a += 2; // what value of 'a' will TB see?
}
}
在获取锁时,TB如何知道他缓存的
我在某个地方读到,互斥量的开销并不大,因为上下文切换只发生在争用的情况下。
在Linux中也知道Futexes。
同样的东西在Windows中也适用吗?是一个更适合于Linux中互斥的映射。
从我收集到的信息来看,与Mutex相比,关键部分提供了更好的最佳性能,这对每种情况都是正确的吗?
在Windows中,是否存在互斥量比关键部分快的情况。
假设只有一个进程线程正在访问互斥项(只是为了消除关键部分的其他好处)。
添加信息: OS windows Server,
Language C++
我有一个基本的样本需要审查(C++)。
假设我有一个函数PublicFunc(),另一个函数名为PrivateFunc()。我想仔细地同步它们。但是PrivateFunc有时也可以调用PublicFunc,这意味着我们从同一个线程调用它。这会导致阻塞,我想要解决它。
mutable boost::mutex m;
void PublicFunc() {
m.lock();
//Here it blocks, but why?
//What I need is to get the lock if this func was called from PrivateFunc(), so e
我对Linux设备驱动程序和内核非常陌生。我基本上想同步一个workque线程(让我们称之为A())与另一个函数(让我们称之为B())。我在这里的目的是在A运行时使B失败。
目前,我所做的工作如下。
A(){
active = true; // a variable shared b/w both A and B
...
...
...
active = false;
}
B(){
if(active){
return -EBUSY
}
}
这是同步这两个函数的正确方法吗?还有其他我应该遵循的策略吗?