Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试锁定未按预期工作的对象 我用C++中的一些代码来摆弄,因为某种原因,我不想工作,我把它缩小到这个例子: #include <thread> #include <atomic> #include <chrono> #include <mutex> #include <iostream> using namespace std; void test() { timed_mutex m; m.lock(); std::cout << "Can i have the lock? " << m.try_lock() << std::endl; std::cout << "in test(), should block for 10 seconds" << std::endl; bool got_lock = m.try_lock_for(std::chrono::seconds(10)); std::cout << "Now i've blocked, got the lock: " << got_lock << std::endl; m.unlock(); } int main() { thread t = thread(&test); t.join(); return EXIT_SUCCESS; }_C++_Multithreading_C++11_Locking_Mutex - Fatal编程技术网

尝试锁定未按预期工作的对象 我用C++中的一些代码来摆弄,因为某种原因,我不想工作,我把它缩小到这个例子: #include <thread> #include <atomic> #include <chrono> #include <mutex> #include <iostream> using namespace std; void test() { timed_mutex m; m.lock(); std::cout << "Can i have the lock? " << m.try_lock() << std::endl; std::cout << "in test(), should block for 10 seconds" << std::endl; bool got_lock = m.try_lock_for(std::chrono::seconds(10)); std::cout << "Now i've blocked, got the lock: " << got_lock << std::endl; m.unlock(); } int main() { thread t = thread(&test); t.join(); return EXIT_SUCCESS; }

尝试锁定未按预期工作的对象 我用C++中的一些代码来摆弄,因为某种原因,我不想工作,我把它缩小到这个例子: #include <thread> #include <atomic> #include <chrono> #include <mutex> #include <iostream> using namespace std; void test() { timed_mutex m; m.lock(); std::cout << "Can i have the lock? " << m.try_lock() << std::endl; std::cout << "in test(), should block for 10 seconds" << std::endl; bool got_lock = m.try_lock_for(std::chrono::seconds(10)); std::cout << "Now i've blocked, got the lock: " << got_lock << std::endl; m.unlock(); } int main() { thread t = thread(&test); t.join(); return EXIT_SUCCESS; },c++,multithreading,c++11,locking,mutex,C++,Multithreading,C++11,Locking,Mutex,代码的行为未定义std::timed_mutex具有非递归所有权语义。 禁止在同一线程上再次获取锁(包括try_lock系列) C++11标准30.4.1.3.1[thread.timedmutex.class]/p3/b2:(感谢Howard Hinnant) 3在以下情况下,程序的行为是未定义的: 拥有定时互斥对象的线程在该对象上调用锁定(),尝试锁定(),尝试锁定(),或尝试锁定直到(),或 C++11标准30.4.1.2[thread.mutex.requirements.mutex

代码的行为未定义
std::timed_mutex
具有非递归所有权语义。 禁止在同一线程上再次获取锁(包括try_lock系列)

C++11标准30.4.1.3.1[thread.timedmutex.class]/p3/b2:(感谢Howard Hinnant)

3在以下情况下,程序的行为是未定义的:

  • 拥有
    定时互斥对象的线程在该对象上调用
    锁定()
    尝试锁定()
    尝试锁定()
    ,或
    尝试锁定直到()
    ,或
C++11标准30.4.1.2[thread.mutex.requirements.mutex]/p6-7:


编辑:

我将如何“解决这个问题”或让它按照我想要的方式运行?我应该使用递归互斥吗

一般来说,考虑到异常安全性,不鼓励获取/释放互斥对象的锁。如果使用
unique\u lock
对象,则
owns\u lock()
成员函数可能会对您有所帮助。 同时,递归互斥对您的目的是无用的,因为“递归”意味着只有“当我已经拥有锁时,我(一个线程)才能获得两次或更多的锁。”

void测试()
{
std::timed_mutex m;
std::unique_lock lk(m,std::defer_lock);
//获取锁
lk.lock();
//您可以通过唯一锁定对象查询锁定状态

std::cout
real 0m10.003s
这是我用g++4.6.3运行代码时的运行时间。看起来还可以。在ubuntu 12上使用g++4.7.2也可以很好地工作。04@Anton您的代码在try\u lock\u for()时失败?@billz至少看起来是这样,它总是几乎立即结束,即,我看不到任何阻塞。我们中的3人测试了您的代码,并按预期工作。+1正确答案错误的引用。30.4.1.3.1[thread.timedmutex.class]/p3/b2:拥有
定时互斥对象调用
lock()
try\u lock()
try\u lock\u for()
,或
在该对象上尝试锁定直到()
,在这种情况下,我想我还有另一个问题,即如何“解决此问题”或使其以我想要的方式运行,我应该发布另一个关于此问题的问题,还是编辑此问题以包含它?我应该改用递归互斥锁吗?
g++ --version
g++ (GCC) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

uname -a
Linux *computername* 3.6.11-1-ARCH #1 SMP PREEMPT Tue Dec 18 08:57:15 CET 2012 x86_64 GNU/Linux
void test()
{
  std::timed_mutex m;
  std::unique_lock<decltype(m)> lk(m, std::defer_lock);

  // acquire lock
  lk.lock();
  // You can query locked status via unique_lock object
  std::cout << "Do I have own lock? " << lk.owns_lock() << std::endl;
  // release lock
  lk.unlock();
}