std::try_lock
De cppreference.com
|
|
This page has been machine-translated from the English version of the wiki using Google Translate.
The translation may contain errors and awkward wording. Hover over text to see the original version. You can help to fix errors and improve the translation. For instructions click here. |
<metanoindex/>
<tbody> </tbody>| Definido no cabeçalho <mutex>
|
||
template< class Lockable1, class Lockable2, class LockableN... > int try_lock( Lockable1& lock1, Lockable2& lock2, LockableN& lockn... ); |
(desde C++11) | |
Tenta bloquear cada um dos objetos dado
Lockable lock1, lock2, ..., lockn chamando try_lock no início ordem com o primeiro. Original:
Tries to lock each of the given
Lockable objects lock1, lock2, ..., lockn by calling try_lock in order beginning with the first. The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
Se uma chamada para
try_lock falhar, unlock é chamado por quaisquer objetos bloqueados e um índice baseado 0 do objeto que não conseguiu travar é devolvido.Original:
If a call to
try_lock fails, unlock is called for any locked objects and a 0-based index of the object that failed to lock is returned.The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
Se uma chamada para resultados
try_lock em uma exceção, unlock é chamado por quaisquer objetos bloqueados antes relançando.Original:
If a call to
try_lock results in an exception, unlock is called for any locked objects before rethrowing.The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
Parâmetros
| lock1, lock2, ... , lockn | - | o
Lockable objetos para bloquearOriginal: the Lockable objects to lockThe text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
Valor de retorno
-1 em sucesso, ou valor de índice 0 baseado do objeto que não conseguiu travar.Original:
-1 on success, or 0-based index value of the object that failed to lock.The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
Exemplo
O exemplo a seguir usa
std::try_lock periodicamente registro e contadores reiniciadas em execução em segmentos separados .
Original:
The following example uses
std::try_lock to periodically tally and reset counters running in separate threads.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
#include <mutex>
#include <vector>
#include <thread>
#include <iostream>
#include <functional>
#include <chrono>
int main()
{
int foo_count = 0;
std::mutex foo_count_mutex;
int bar_count = 0;
std::mutex bar_count_mutex;
int overall_count = 0;
bool done = false;
std::mutex done_mutex;
auto increment = [](int &counter, std::mutex &m, const char *desc) {
for (int i = 0; i < 10; ++i) {
std::unique_lock<std::mutex> lock(m);
++counter;
std::cout << desc << ": " << counter << '\n';
lock.unlock();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
};
std::thread increment_foo(increment, std::ref(foo_count),
std::ref(foo_count_mutex), "foo");
std::thread increment_bar(increment, std::ref(bar_count),
std::ref(bar_count_mutex), "bar");
std::thread update_overall([&]() {
done_mutex.lock();
while (!done) {
done_mutex.unlock();
int result = std::try_lock(foo_count_mutex, bar_count_mutex);
if (result == -1) {
overall_count += foo_count + bar_count;
foo_count = 0;
bar_count = 0;
std::cout << "overall: " << overall_count << '\n';
foo_count_mutex.unlock();
bar_count_mutex.unlock();
}
std::this_thread::sleep_for(std::chrono::seconds(2));
done_mutex.lock();
}
done_mutex.unlock();
});
increment_foo.join();
increment_bar.join();
done_mutex.lock();
done = true;
done_mutex.unlock();
update_overall.join();
std::cout << "Done processing\n"
<< "foo: " << foo_count << '\n'
<< "bar: " << bar_count << '\n'
<< "overall: " << overall_count << '\n';
}
Potencial saída:
bar: 1
foo: 1
foo: 2
bar: 2
foo: 3
overall: 5
bar: 1
foo: 1
bar: 2
foo: 2
bar: 3
overall: 10
bar: 1
foo: 1
bar: 2
foo: 2
overall: 14
bar: 1
foo: 1
bar: 2
overall: 17
foo: 1
bar: 1
foo: 2
overall: 20
Done processing
foo: 0
bar: 0
overall: 20
Veja também
(C++11) |
bloqueia especificados semáforos, blocos se algum não estão disponíveis Original: locks specified mutexes, blocks if any are unavailable The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (modelo de função) |