#c #multithreading
#c #многопоточность
Вопрос:
Я знаю, что этот тип вопроса уже задавался, но я не могу понять причину ошибок, которые я получаю..
Я пытаюсь протестировать реализацию блокировки, как указано ниже, используя несколько потоков:
class TTAS
{
atomic<bool> state;
public:
TTAS(){
state = ATOMIC_FLAG_INIT;
}
void lock() {
while(true) {
while(state) {};
// using exchange() which is equivalent to getAndSet but with lookup
if (!state.exchange(true)) {
return;
}
}
}
void unlock() {
state.exchange(false);
}
};
Я создаю потоки для этого, используя приведенный ниже код:
void test2(TTAS t) {
}
TTAS t();
for (int i = 0; i < 10; i ) {
// Create a thread and push it into the thread list and call the distributedWrite function
threadList.push_back(std::thread(test2, std::ref(t)));
}
Когда я компилирую этот код, я получаю приведенную ниже ошибку. Я не знаю, что я здесь делаю не так..
In file included from /usr/include/c /5/thread:39:0,
from assgn4.cpp:17:
/usr/include/c /5/functional: In instantiation of ‘struct std::_Bind_simple<void (*(std::reference_wrapper<TTAS()>))(TTAS)>’:
/usr/include/c /5/thread:137:59: required from ‘std::thread::thread(_Callableamp;amp;, _Argsamp;amp; ...) [with _Callable = void (amp;)(TTAS); _Args = {std::reference_wrapper<TTAS()>}]’
assgn4.cpp:186:60: required from here
/usr/include/c /5/functional:1505:61: error: no type named ‘type’ in ‘class std::result_of<void (*(std::reference_wrapper<TTAS()>))(TTAS)>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/include/c /5/functional:1526:9: error: no type named ‘type’ in ‘class std::result_of<void (*(std::reference_wrapper<TTAS()>))(TTAS)>’
_M_invoke(_Index_tuple<_Indices...>)
^
Не мог бы кто-нибудь, пожалуйста, объяснить эту ошибку. Заранее спасибо
Ответ №1:
Кажется, вы столкнулись с самым неприятным синтаксическим анализом
TTAS t();
t
это функция, не принимающая аргументов и возвращающая TTAS
.
Предпочитаю единообразный синтаксис инициализации1 вместо устаревшего:
TTAS t{}; // no ambiguity here
Есть еще одна проблема с вашим кодом, который test2
принимает свой аргумент по значению, но TTAS
содержит std::atomic<bool>
который не является ни копируемым, ни перемещаемым.
1
хотя это несколько неправильное название, поскольку оно не совсем единообразно
Комментарии:
1. Спасибо за быстрый ответ.. Я изменил
atomic<bool>
наatomic<bool>*
, что устранило проблему..2. @anirudh моим первым шагом было бы заставить
test2
принять ссылку, но я не знаю вашего варианта использования, поэтому ваше решение может быть совершенно верным и лучшим.
Ответ №2:
TTAS t();
это объявление функции. объявите его как TTAS t;
, если вам нужна переменная, созданная по умолчанию.