Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 4

Ошибка пи компиляции

04.12.2014, 09:39. Показов 1551. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выполняю лабу, вот ее задание
1) Запускается четное количество потоков параллельно.
2) Каждый нечетный поток (например, первый) создает файл с именем из своего PID, записывает в него произвольное число символов (от не-скольких символов до сотен миллионов символов) и закрывает этот файл.
3) Каждый четный поток (например, второй) открывает файл, созданный предыдущим потоком с нечетным номером (в нашем случае первым), читает его, считает количество символов в файле и закрывает его; при этом четный поток не должен иметь никакой информации о количест-ве записываемых в файл символов и о том, закончена ли запись в файл нечетным потоком.
4) Каждый из потоков выводит следующую информацию: ThreadID, PID, PPID, время, имя файла, количество записанных или считанных сим-волов.
5) Количество пар создаваемых потоков передается аргументом в про-грамму с командной строки. Программа должна ждать завершения работы всех потоков, анализировать и сообщать о причинах заверше-ния потоков. Для передачи имен файлом между потоками можно ис-пользовать символьный массив в основной программе.
Написал вот такой код
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <pthread.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
 
char** files; // массив с именами файлов
 
void* create_file(void *arg) // поток создания файла
{
int ind = (int) arg; // индекс указывающий на имя файла
FILE* fl;
long unsigned int PID;
int pid, ppid, num;
long unsigned int len, i = 0;
char buf;
time_t vremya= time(NULL);
num = ind*2 + 1; // номер потока
len = random(); // количество символов в файле
PID = pthread_self(); // ThreadID
pid = getpid(); // PID
ppid = getppid(); // PPID
sprintf(files[ind], "%s/%lu%s", getenv("HOME"), PID, ".txt"); // имя файла
fl = fopen(files[ind], "w");// создаем файл
if( fl ) // если файл создан
{
while( i!=len) // пока не запишем все символы
{
if( i % 2 ) buf = '0';
else buf = '1';
fputc(buf, fl); // записываем символ в файл
i++;
}
fclose(fl); // закрываем файл
}
// выводим на экран информацию о потоке и файле
printf("\nThread #%i\n\tThreadID: %lu\n\tPID: %i\n\tPPID: %i\n\tTimeDate: %s\tFileName: %s\n\tLength: %lu\n", num, PID, pid, ppid, ctime(&vremya), files[ind], len);
pthread_exit(NULL);
}
 
void* read_file(void *arg) // поток читающий файл
{
int ind = (int) arg; // индекс указывающий на имя файла
FILE* fl;
long unsigned int PID;
int i = 0, pid, ppid, num;
long int len = 0;
char t[32];
char buf[256];
time_t vremya= time(NULL);
num = ind*2 + 2;
PID = pthread_self(); // ThreadID
pid = getpid(); // PID
ppid = getppid(); // PPID
fl = fopen(files[ind], "r"); // открываем файл для чтения
if( fl ) // если файл открылся
{
strcpy(buf, files[ind]); // считываем название файла
while( i!=EOF ) // пока не достигнем конца файла
{
i = fgetc(fl); // считываем по-символьно
if( i!=EOF ) len++; // счетчик символов
}
fclose(fl); // закрываем файл
}
else // если файла нет
{
strcpy(buf, "file not found");
}
// выводим результаты работы
printf("\nThread #%i\n\tThreadID: %lu\n\tPID: %i\n\tPPID: %i\n\tTimeDate: %s\tFileName: %s\n\tLength: %lu\n", num, PID, pid, ppid, ctime(&vremya), buf, len);
pthread_exit(NULL);
}
 
// запускаем приложение
int main(int argc, char* argv[])
{
int i, qnt, res, tmp;
FILE* fl;
pthread_t* ws;
pthread_t* rs;
srandom(time(NULL));
if( argc == 2 ) qnt = atoi(argv[argc-1]); // выбираем количество пар потоков из командной строки
else qnt = 0;
if( qnt ) // если в командной строке прописано количество пар потоков
{
ws = new pthread_t[qnt]; // создаем указатели на потоки записи
rs = new pthread_t[qnt]; // создаем указатели на потоки чтения
files = new char*[qnt]; // создаем массив имен файлов
for(i=0; i<qnt;i++)
{
files[i] = new char[256]; // инициализируем строку имени файла
res = pthread_create(&ws[i], NULL, create_file, (void*)i); // запускаем нечетный поток
if (res != 0) // проверка на успех
{
perror("creation failed");
exit(EXIT_FAILURE);
}
res = pthread_create(&rs[i], NULL, read_file, (void*)i); // запускаем четный поток
if (res != 0) // проверяем
{
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
}
// проверяем завершение потоков, а так же удаляем файлы и очищаем память
for(i=qnt-1; i>=0; i--)
{
tmp = i*2+1;
res = pthread_join(ws[i], NULL);
if (res == 0) printf("Picked up a thread #%i\n", tmp);
else perror("pthread_join failed");
tmp = i*2+2;
res = pthread_join(rs[i], NULL);
if (res == 0) printf("Picked up a thread #%i\n", tmp);
else perror("pthread_join failed");
fl = fopen(files[i], "r");
if( fl )
{
fclose(fl);
remove(files[i]);
}
delete [] files[i];
}
 
delete [] files;
delete [] ws;
delete [] rs;
}
 
printf("All done\n");
exit(EXIT_SUCCESS);
}
При компиляции появляются ошибки типа expected ';' before pthread_t в месте
C++ (Qt)
1
ws = new pthread_t[qnt]; // создаем указатели на потоки записи
Помогите как исправить ошибку, голова уже кипит от этого
Среда выполнения qt creator ubuntu
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2014, 09:39
Ответы с готовыми решениями:

Ошибка компиляции
Дана задача с использованием friend-ов. Не могу понять почему программа не видит (Square s(5, 4);) Помогите пожалуйста чайнику) ...

Ошибка при компиляции
Есть код программы органайзера, но из-за чего-то на моем компьютере она не компилируется. Вот кусок кода на который он ругается: ...

Ошибка компиляции CharLower
Какой инклуд надо включить, что бы при компиляции не выбивало ошибку, что CharLower неизвестная функция. Знаю что глупый вопрос, искал в...

3
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
04.12.2014, 10:05
вот так собирается
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
 
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <dirent.h>
 
char** files; // массив с именами файлов
 
void* create_file(void *arg) // поток создания файла
{
    int* tmp =(int*) arg; // индекс указывающий на имя файла
    int ind = *tmp;
    delete tmp;
 
    FILE* fl;
    long unsigned int PID;
    int pid, ppid, num;
    long unsigned int len, i = 0;
    char buf;
    time_t vremya= time(NULL);
    num = ind*2 + 1; // номер потока
    len = random(); // количество символов в файле
    PID = pthread_self(); // ThreadID
    pid = getpid(); // PID
    ppid = getppid(); // PPID
    sprintf(files[ind], "%s/%lu%s", getenv("HOME"), PID, ".txt"); // имя файла
    fl = fopen(files[ind], "w");// создаем файл
    if( fl ) // если файл создан
    {
        while( i!=len) // пока не запишем все символы
        {
            if( i % 2 ) buf = '0';
            else buf = '1';
            fputc(buf, fl); // записываем символ в файл
            i++;
        }
        fclose(fl); // закрываем файл
    }
    // выводим на экран информацию о потоке и файле
    printf("\nThread #%i\n\tThreadID: %lu\n\tPID: %i\n\tPPID: %i\n\tTimeDate: %s\tFileName: %s\n\tLength: %lu\n", num, PID, pid, ppid, ctime(&vremya), files[ind], len);
    pthread_exit(NULL);
}
 
void* read_file(void *arg) // поток читающий файл
{
    int* tmp =(int*) arg; // индекс указывающий на имя файла
    int ind = *tmp;
    delete tmp;
    FILE* fl;
    long unsigned int PID;
    int i = 0, pid, ppid, num;
    long int len = 0;
    //char t[32];
    char buf[256];
    time_t vremya= time(NULL);
    num = ind*2 + 2;
    PID = pthread_self(); // ThreadID
    pid = getpid(); // PID
    ppid = getppid(); // PPID
    fl = fopen(files[ind], "r"); // открываем файл для чтения
    if( fl ) // если файл открылся
    {
        strcpy(buf, files[ind]); // считываем название файла
        while( i!=EOF ) // пока не достигнем конца файла
        {
            i = fgetc(fl); // считываем по-символьно
            if( i!=EOF ) len++; // счетчик символов
        }
        fclose(fl); // закрываем файл
    }
    else // если файла нет
    {
        strcpy(buf, "file not found");
    }
    // выводим результаты работы
    printf("\nThread #%i\n\tThreadID: %lu\n\tPID: %i\n\tPPID: %i\n\tTimeDate: %s\tFileName: %s\n\tLength: %lu\n", num, PID, pid, ppid, ctime(&vremya), buf, len);
    pthread_exit(NULL);
}
 
// запускаем приложение
int main(int argc, char* argv[])
{
    int i, qnt, res, tmp;
    FILE* fl;
    pthread_t* ws;
    pthread_t* rs;
    srandom(time(NULL));
    if( argc == 2 ) qnt = atoi(argv[argc-1]); // выбираем количество пар потоков из командной строки
    else qnt = 0;
    if( qnt ) // если в командной строке прописано количество пар потоков
    {
        ws = new pthread_t[qnt]; // создаем указатели на потоки записи
        rs = new pthread_t[qnt]; // создаем указатели на потоки чтения
        files = new char*[qnt]; // создаем массив имен файлов
        for(i=0; i<qnt;i++)
        {
            files[i] = new char[256]; // инициализируем строку имени файла
            res = pthread_create(&ws[i], NULL, create_file, new int(i)); // запускаем нечетный поток
            if (res != 0) // проверка на успех
            {
                perror("creation failed");
                exit(EXIT_FAILURE);
            }
            res = pthread_create(&rs[i], NULL, read_file, new int(i)); // запускаем четный поток
            if (res != 0) // проверяем
            {
                perror("Thread creation failed");
                exit(EXIT_FAILURE);
            }
        }
        // проверяем завершение потоков, а так же удаляем файлы и очищаем память
        for(i=qnt-1; i>=0; i--)
        {
            tmp = i*2+1;
            res = pthread_join(ws[i], NULL);
            if (res == 0) printf("Picked up a thread #%i\n", tmp);
            else perror("pthread_join failed");
            tmp = i*2+2;
            res = pthread_join(rs[i], NULL);
            if (res == 0) printf("Picked up a thread #%i\n", tmp);
            else perror("pthread_join failed");
            fl = fopen(files[i], "r");
            if( fl )
            {
                fclose(fl);
                remove(files[i]);
            }
            delete [] files[i];
        }
 
        delete [] files;
        delete [] ws;
        delete [] rs;
    }
 
    printf("All done\n");
    exit(EXIT_SUCCESS);
}

project.pro
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
 
LIBS+= -pthread
 
SOURCES += main.cpp
 
include(deployment.pri)
qtcAddDeployment()
1
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 4
04.12.2014, 12:12  [ТС]
Создал новый проект, именил там файл .pro теперь при компиляции ошибки

/home/max/prog/main.cpp:103: error: undefined reference to `pthread_create'
/home/max/prog/main.cpp:120: error: undefined reference to `pthread_join'
:-1: error: collect2: error: ld returned 1 exit status

В чем ошибка
Сannot read /home/max/prog/deployment.pri: No such file or directory
/home/max/prog/prog.pro(9): 'qtcAddDeployment' is not a recognized test function.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
04.12.2014, 14:42
Лучший ответ Сообщение было отмечено Geonix22 как решение

Решение

вот проект
Вложения
Тип файла: 7z wr_threads.7z (5.0 Кб, 21 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2014, 14:42
Помогаю со студенческими работами здесь

Ошибка компиляции/линковки.
Компилирую программу отсюда: ... от рута: g++ dae.cpp выдает: что делать?

Ошибка компиляции ассемблерной вставки
Добрый вечер. Захотелось мне сделать ассемблерную вставку в C++ код. Сделал. Но компилятору MinGW чето не нравится. Выдает следующие ошибки...

ошибка при компиляции С++ eclipse
Добрый день. Написал программу на С++ на raspberry, компилируется нормально. Решил запустить ее на другом компьютере. Установлен...

Ошибка сегментирования при компиляции
Когда компилирую через g++ компилируется, при запуске выдает ошибку сегментирования, а при компиляции через NetBeans IDE выдает две ошибки,...

Ошибка компиляции нескольких файлов
Добрый день. Изучаю книгу Харви С++ в теме отделение &quot;интерфейса от реализации&quot; возникла проблема с компиляцией файлов GradeBook.cpp и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru