gcc — Построение транзакционной памяти C ++ кода в g ++

На сайте cppreference есть (работа в процессе) страница, описывающая код транзакционной памяти c ++. Это первый пример на странице

#include <iostream>
#include <vector>
#include <thread>
int f()
{
static int i = 0;
synchronized { // begin synchronized block
std::cout << i << " -> ";
++i;       // each call to f() obtains a unique value of i
std::cout << i << '\n';
return i; // end synchronized block
}
}
int main()
{
std::vector<std::thread> v(10);
for(auto& t: v)
t = std::thread([]{ for(int n = 0; n < 10; ++n) f(); });
for(auto& t: v)
t.join();
}

В нижней части этой страницы есть указание, что это основано на gcc (// GCC assembly with the attribute:).

Я не могу получить это, чтобы построить на G ++ 5.3.1:

$ g++ --std=c++11 -fgnu-tm -lpthread trx.cpp
trx.cpp: In function ‘int f()’:
trx.cpp:7:5: error: ‘synchronized’ was not declared in this scope
synchronized { // begin synchronized block
^

$ g++ --help | grep transaction

$ g++ --version
g++ (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413

документация gcc делает иметь страница в транзакционной памяти, но примитивы разные (например, атомный блок __transaction_atomic). Страница на cppreference.com, наоборот, похоже, связана с N3919, и использует примитивы оттуда.

Как этот код может быть построен с G ++?

1

Решение

transactional_memory ссылка, которую вы упомянули, сначала говорит:

Поддержка компилятора

Данная техническая спецификация поддерживается GCC начиная с версии 6.1 (требуется -fgnu-tm включить).

Так вам нужно GCC 6 (и, вероятно, также -std=c++1z в дополнение к -fgnu-tm ….)

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]