Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
3 / 3 / 0
Регистрация: 08.10.2022
Сообщений: 22

Многопоточность в с++ никак не хочет работать!

28.11.2022, 01:56. Показов 1893. Ответов 20

Студворк — интернет-сервис помощи студентам
Все привет. Появилась проблема, и очень важная.
Необходимо реализовать многопоточность в приложении, но ни одно, даже базовое приложение из примеров использования thread не работает, как будто компилятор не хочет даже слышать о потоках.
Код:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>
#include <iostream>
#include <thread>
 
using namespace std;
 
void task1(string msg)
{
    cout << "task1 says: " << msg;
}
 
int main()
{
    thread t1(task1, "Hello");
    t1.join();
}
Компилирую следующим образом: g++ test.cpp -std=c++11 -pthread.

На выходе получается соелующее:
test.cpp: In function 'int main()':
test.cpp:14:29: error: no matching function for call to 'std::thread::thread(void (&)(std::string), const char [6])'
14 | thread t1(task1, "Hello");
| ^
In file included from c:\users\sanov\gcc\include\c++\12.2.0\th read:43,
from test.cpp:3:
gcc\include\c++\12.2.0\bits\std_thread.h :156:5: note: candidate: 'std::thread::thread(std::thread&&)'
156 | thread(thread&& __t) noexcept
| ^~~~~~
gcc\include\c++\12.2.0\bits\std_thread.h :156:5: note: candidate expects 1 argument, 2 provided
gcc\include\c++\12.2.0\bits\std_thread.h :120:5: note: candidate: 'std::thread::thread()'
120 | thread() noexcept = default;
| ^~~~~~
gcc\include\c++\12.2.0\bits\std_thread.h :120:5: note: candidate expects 0 arguments, 2 provided

Может у меня компилятор "Бракованный" или я хз что. Нужна помощь..
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2022, 01:56
Ответы с готовыми решениями:

Wi-Fi никак не хочет работать
Роутер 1 портовый в Lan воткнут кабель со свича, в комп где юзергейт инет входит от провайдера в одну сетевуху, с другой по юзергейту...

Синонимайзер никак не хочет работать
function synonimize($str, $repl_array){ $keys = array_map(function($key){ return '#'.$key.'#ui'; }, $repl_array); ...

Сервер - ну никак не хочет работать:(
Доброго времени суток, уважаемые форумчане:) Устроился я на новую работу в небольшую компанию, устроился создать сайт и админить его ...

20
Модератор
Эксперт Java
 Аватар для alecss131
2856 / 1363 / 406
Регистрация: 11.08.2017
Сообщений: 4,352
Записей в блоге: 2
28.11.2022, 11:07
На с++11 и выше все работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
#include <iostream>
#include <thread>
 
void task1(const std::string &msg) {
    std::cout << "task1 says: " << msg << std::endl;
}
 
int main() {
    std::thread t1{task1, "Hello"};
    t1.join();
}
1
3 / 3 / 0
Регистрация: 08.10.2022
Сообщений: 22
28.11.2022, 12:02  [ТС]
К сожалению, тот же ряд ошибок

test.cpp: In function 'int main()':
test.cpp:10:34: error: no matching function for call to 'std::thread::thread(<brace-enclosed initializer list>)'
10 | std::thread t1{task1, "Hello"};
| ^
In file included from c:\users\sanov\gcc\include\c++\12.2.0\th read:43,
from test.cpp:3:
c:\users\sanov\gcc\include\c++\12.2.0\bi ts\std_thread.h:156:5: note: candidate: 'std::thread::thread(std::thread&&)'
156 | thread(thread&& __t) noexcept
| ^~~~~~
c:\users\sanov\gcc\include\c++\12.2.0\bi ts\std_thread.h:156:5: note: candidate expects 1 argument, 2 provided
c:\users\sanov\gcc\include\c++\12.2.0\bi ts\std_thread.h:120:5: note: candidate: 'std::thread::thread()'
120 | thread() noexcept = default;
| ^~~~~~
c:\users\sanov\gcc\include\c++\12.2.0\bi ts\std_thread.h:120:5: note: candidate expects 0 arguments, 2 provided
0
фрилансер
 Аватар для Алексей1153
6455 / 5656 / 1129
Регистрация: 11.10.2019
Сообщений: 15,059
28.11.2022, 12:31
CodyLV, а так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <iostream>
#include <thread>
 
void task1(const std::string msg)
{
    std::cout << "task1 says: " << msg << std::endl;
}
 
int main()
{
    std::thread t1(task1, "Hello");
    t1.join();
}
0
3 / 3 / 0
Регистрация: 08.10.2022
Сообщений: 22
28.11.2022, 13:06  [ТС]
Аналогично. Подозреваю, что в библиотеках компилятора какие-то проблемы с thread'ами. Версия gcc - 12.2.0, если что
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.11.2022, 13:21
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а так
а так - монопенисуально.

всмысле:
квалификаторы параметров функций,
передаваемых по значению, отбрасывается.

пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
 
int main()
{
    using a = void(std::string);
    using b = void(const std::string);
    
    static_assert(
        std::is_same_v<a, b>, 
        "ожидаются идентичные типы функций"
    );
}
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
28.11.2022, 14:08
Цитата Сообщение от CodyLV Посмотреть сообщение
-pthread
Это точно надо?

Сам ваш код отлично компилируется и работает, проверьте любом online-c++
1
3 / 3 / 0
Регистрация: 08.10.2022
Сообщений: 22
28.11.2022, 14:16  [ТС]
Да, без него тоже не компилируется, а этот флаг рекомендовали на всех ресурсах, что нашел. Спасибо за ответ, попробую переустановить gcc
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
28.11.2022, 14:22
Еще как вариант - уберите вот это
Цитата Сообщение от CodyLV Посмотреть сообщение
using namespace std;
и добавьте std:: по феншую
Вдруг оно там с чем-то путается
0
3 / 3 / 0
Регистрация: 08.10.2022
Сообщений: 22
28.11.2022, 15:27  [ТС]
Пробовал - тоже никак

Сейчас пытаюсь реализовать задуманное через boost::thread, не подскажите, где нужно хранить библиотеки сторонние? В папку с проектом кладу, но через include программа не видит ее. Может куда-то в папку операционной системы нужно засунуть?)
0
Модератор
Эксперт Java
 Аватар для alecss131
2856 / 1363 / 406
Регистрация: 11.08.2017
Сообщений: 4,352
Записей в блоге: 2
28.11.2022, 15:38
Цитата Сообщение от CodyLV Посмотреть сообщение
Может куда-то в папку операционной системы нужно засунуть?
Крайне плохая практика
Советую изучить хотя бы основы CMake
0
 Аватар для zorggish
94 / 92 / 18
Регистрация: 10.03.2017
Сообщений: 306
28.11.2022, 15:42
Цитата Сообщение от CodyLV Посмотреть сообщение
Сейчас пытаюсь реализовать задуманное через boost::thread
Советую всё таки разобраться со стандартом и версией компилятора, это лучше чем реализовывать через boost то что уже есть в стандартной библиотеке
0
3 / 3 / 0
Регистрация: 08.10.2022
Сообщений: 22
28.11.2022, 15:49  [ТС]
Да я бы с радостью, но я перепробовал все минимальные тестовые примеры, переустановил gcc, переписывал код по разным советам и ни один не скомпилировался

Добавлено через 3 минуты
Так, ладно, все-так отказываюсь от сторонних библиотек и попробую еще поискать что делать с встроенным thread
0
 Аватар для zorggish
94 / 92 / 18
Регистрация: 10.03.2017
Сообщений: 306
28.11.2022, 15:50
Цитата Сообщение от CodyLV Посмотреть сообщение
Да я бы с радостью, но я перепробовал все минимальные тестовые примеры, переустановил gcc, переписывал код по разным советам и ни один не скомпилировался
Скажите, пожалуйста, что у вас будет выведено в результате выполнения следующего кода
C++
1
2
3
4
5
6
7
8
9
#include<iostream>
 
int main() {
    if (__cplusplus == 201703L) std::cout << "C++17\n";
    else if (__cplusplus == 201402L) std::cout << "C++14\n";
    else if (__cplusplus == 201103L) std::cout << "C++11\n";
    else if (__cplusplus == 199711L) std::cout << "C++98\n";
    else std::cout << "pre-standard C++\n";
}
0
3 / 3 / 0
Регистрация: 08.10.2022
Сообщений: 22
28.11.2022, 15:52  [ТС]
Меня очень смущает вечное указание следующей ошибки:

std::thread t1(task1, "Hello");

Ошибка всегда указывает на последнюю скобку, но я уверен, что написано правильно. И эта ошибка вылазит в любом минимальном тестовом коде.

Добавлено через 25 секунд
Опа.

c:/users/sanov/gcc/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find std=c++11: No such file or directory
collect2.exe: error: ld returned 1 exit status

Это ж что получается, я все время компилировал указывая несуществующую версию языка?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
28.11.2022, 15:53
Уберите параметры из task1
На пробу
Впечатление что в этом беда

Добавлено через 47 секунд
Цитата Сообщение от CodyLV Посмотреть сообщение
Это ж что получается, я все время компилировал указывая несуществующую версию языка?
Явно так
0
3 / 3 / 0
Регистрация: 08.10.2022
Сообщений: 22
28.11.2022, 15:58  [ТС]
Хорошо. Странно, я качал gcc с официального сайта, я не думаю что у них там нет 11 стандарта. Как-то отдельно можно докачать стандарт или нужно искать сторонний источник с gcc?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
28.11.2022, 16:04
CodyLV, нормальный у тебя компилятор, он и с++20 поддерживает. Просто у тебя не определен внутренний макрос _GLIBCXX_HAS_GTHREADS, поэтому шаблон конструктора не доступен. Попробуй вместо флага -pthread флаг -lpthread.

Добавлено через 5 минут
А еще посмотри в каталоге bin файл c именем начинающимся на libwinpthread (напр. libwinpthread-1.dll)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.11.2022, 16:05
Цитата Сообщение от KSergey9 Посмотреть сообщение
Явно так
Нет, не так. Он просто - пропустил при задании опции.

Цитата Сообщение от CodyLV Посмотреть сообщение
cannot find std=c++11: No such file or directory
Знак - пропущен.
1
3 / 3 / 0
Регистрация: 08.10.2022
Сообщений: 22
28.11.2022, 16:05  [ТС]
Полный текст командной строки начиная от компиляции:

C:\Users\sanov\gcc\Data>g++ -std=c++11 -lpthread test.cpp
test.cpp: In function 'int main()':
test.cpp:12:25: error: no matching function for call to 'std::thread::thread(void (&)())'
12 | std::thread t1(task1);
| ^
In file included from c:\users\sanov\gcc\include\c++\12.2.0\th read:43,
from test.cpp:3:
c:\users\sanov\gcc\include\c++\12.2.0\bi ts\std_thread.h:156:5: note: candidate: 'std::thread::thread(std::thread&&)'
156 | thread(thread&& __t) noexcept
| ^~~~~~
c:\users\sanov\gcc\include\c++\12.2.0\bi ts\std_thread.h:156:21: note: no known conversion for argument 1 from 'void()' to 'std::thread&&'
156 | thread(thread&& __t) noexcept
| ~~~~~~~~~^~~
c:\users\sanov\gcc\include\c++\12.2.0\bi ts\std_thread.h:120:5: note: candidate: 'std::thread::thread()'
120 | thread() noexcept = default;
| ^~~~~~
c:\users\sanov\gcc\include\c++\12.2.0\bi ts\std_thread.h:120:5: note: candidate expects 0 arguments, 1 provided


Код сократил до минимального:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <iostream>
#include <thread>
 
void task1()
{
    std::cout << "task1 says: " << std::endl;
}
 
int main()
{
    std::thread t1(task1);
    t1.join();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.11.2022, 16:05
Помогаю со студенческими работами здесь

Функция ну никак не хочет работать
Вот функция void OPEN_USER_COMMAND(System::String^ PolzCom) { System::String^ Temp = &quot;PrgBase\\&quot;; ...

HP G6 1131sr никак не хочет работать
Здравствуйте! Ни как не хочет работать дрова на видео карту, ноут HP G6 1131sr ЦПУ: AMD ГПУ: AMD Radeon HD 6470M ATI Mobility...

Перемещение фона никак не хочет работать!
Хотел сделать динамический фон: картинка на фоне плывет так, чтобы был достигнут ее низ, а затем обратно. Плавно! Решил погуглить, вводил...

Дискретная видео карта никак не хочет работать
Здравствуйте все! Проблема такова, дискретная видео карта Nvidia GT640M от ноута, никак не запускает через себя игры, такие как world of...

SEGATE ST3500320AS SD1A (бывший SD15) не хочет никак работать как логический диск
Cлучилась такая хрень что он у меня програмно не хочет никак работать как логический диск, тобишь он сидит у меня как физический диск, но я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru