3 / 3 / 2
Регистрация: 06.06.2014
Сообщений: 95
1

Ошибка компиляции приложения, использующего потоки

22.09.2015, 13:27. Показов 915. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня такое задание по лабораторной работе.
Напишите программу на языке Cи, в которой:
1) Запускается четное количество потоков параллельно.
2) Каждый нечетный поток (например, первый) создает файл с именем из своего PID, записывает в него произвольное число символов (от нескольких символов до сотен миллионов символов) и закрывает этот файл.
3) Каждый четный поток (например, второй) открывает файл, созданный предыдущим потоком с нечетным номером (в нашем случае первым), читает его, считает количество символов в файле и закрывает его; при этом четный поток не должен иметь никакой информации о количестве записываемых в файл символов и о том, закончена ли запись в файл нечетным потоком.
4) Каждый из потоков выводит следующую информацию: ThreadID, PID, PPID, время, имя файла, количество записанных или считанных символов.
5) Количество пар создаваемых потоков передается аргументом в программу с командной строки. Программа должна ждать завершения работы всех потоков, анализировать и сообщать о причинах завершения потоков. Для передачи имен файлом между потоками можно использовать символьный массив в основной программе.

Я написал программу
C
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
144
145
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
 
#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;
    int rec_error;
    free (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("PWD"), PID, ".txt"); // имя файла
    fl = fopen(files[ind], "w");// создаем файл
    if( fl ) // если файл создан
    {
        while( i!=len) // пока не запишем все символы
        {
            if( i % 2 ) buf = '0';
            else buf = '1';
            fputc(buf, fl);
            i++;
        } 
        if( fclose(fl) == EOF) printf("Fclose Error"); // закрываем файл
    }
    // выводим на экран информацию о потоке и файле
    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;
    free (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++; // счетчик символов
        }
        if( fclose(fl) == EOF) printf("Fclose Error"); // закрываем файл
    }
    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]);
            }
            free (files[i]);
        }
 
        free (files);
        free (ws);
        free (rs);
    }
 
    printf("All done\n");
    exit(EXIT_SUCCESS);
}
Но при попытке компиляции (компилятор gcc) выдает такие ошибки:
j.c: In function ‘main’:
j.c:99:14: error: ‘new’ undeclared (first use in this function)
j.c:99:14: note: each undeclared identifier is reported only once for each function it appears in
j.c:99:18: error: expected ‘;’ before ‘pthread_t’
j.c:100:18: error: expected ‘;’ before ‘pthread_t’
j.c:101:21: error: expected ‘;’ before ‘char’
j.c:104:28: error: expected ‘;’ before ‘char’
j.c:105:65: error: expected ‘)’ before ‘int’
j.c:111:63: error: expected ‘)’ before ‘int’

Подскажите пожалуйста как их исправить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2015, 13:27
Ответы с готовыми решениями:

Возникает ошибка при компиляции приложения C2678
Вообщем-то всем привет, есть задача сделать приложение, которое сможет отсортировать список, это,...

Ошибка при компиляции проекта, использующего libtcod-net
Приветствую, форумчане. Появляется ошибка при компиляции проекта. Либо пишет это и не дает...

Потоки. Ввод-вывод. Ошибка на этапе компиляции.
#include &lt;windows.h&gt; #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace...

Ошибки при компиляции проекта, использующего SFML
Всем привет. Не так давно практикую C++, сегодня решил подключить библиотеку SFML. Все сделал по...

7
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
22.09.2015, 13:35 2
Надо переименовать файл так, что бы у него было расширение *.cpp , что бы компилятор его воспринимал именно как C++, а не просто C.
0
3 / 3 / 2
Регистрация: 06.06.2014
Сообщений: 95
22.09.2015, 13:37  [ТС] 3
Humanoid
Мне наоборот нужно чтобы понимал его как C.
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
22.09.2015, 22:58 4
В Си нет оператора new... тогда надо через функции malloc() писать.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
23.09.2015, 20:43 5
Цитата Сообщение от Humanoid Посмотреть сообщение
тогда надо через функции malloc() писать
Особенно с учётом того, что в данной программе память через fre освобождается
0
3 / 3 / 2
Регистрация: 06.06.2014
Сообщений: 95
29.09.2015, 09:52  [ТС] 6
Я попытался исправить, но всё равно не хочет компилировать. Может я ещё что-то упустил?
C
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
144
145
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
 
#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;
    int rec_error;
    free (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("PWD"), PID, ".txt"); // имя файла
    fl = fopen(files[ind], "w");// создаем файл
    if( fl ) // если файл создан
    {
        while( i!=len) // пока не запишем все символы
        {
            if( i % 2 ) buf = '0';
            else buf = '1';
            fputc(buf, fl);
            i++;
        } 
        if( fclose(fl) == EOF) printf("Fclose Error"); // закрываем файл
    }
    // выводим на экран информацию о потоке и файле
    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;
    free (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++; // счетчик символов
        }
        if( fclose(fl) == EOF) printf("Fclose Error"); // закрываем файл
    }
    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 = malloc (pthread_t[qnt]); // создаем указатели на потоки записи
        rs = malloc (pthread_t[qnt]); // создаем указатели на потоки чтения
        files = malloc (char*[qnt]); // создаем массив имен файлов
        for(i=0; i<qnt;i++)
        {
            files[i] = malloc (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]);
            }
            free (files[i]);
        }
 
        free (files);
        free (ws);
        free (rs);
    }
 
    printf("All done\n");
    exit(EXIT_SUCCESS);
}
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
29.09.2015, 18:44 7
WolfEater, вместо
Цитата Сообщение от WolfEater Посмотреть сообщение
malloc (pthread_t[qnt])
Цитата Сообщение от WolfEater Посмотреть сообщение
malloc (char*[qnt])
нужно
C
1
malloc (sizeof(pthread_t)*qnt)
и
C
1
malloc (sizeof(char*)*qnt)
+ не все new удалили (105 и 111).
0
3 / 3 / 2
Регистрация: 06.06.2014
Сообщений: 95
30.09.2015, 07:07  [ТС] 8
schdub
A
C
1
new int(i)
нужно заменить на

C
1
malloc (sizeof(int*)*i)
?
0
30.09.2015, 07:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2015, 07:07
Помогаю со студенческими работами здесь

Распространение приложения, использующего QDB2
Доброго времени суток. Прошу помощи. Имеется написанное на Qt приложение, использующее драйвер...

Создание приложения, использующего цикл for
Дан код программы : static void Main(string args){ Console.WriteLine(&quot;Вычисление...

Ошибка при компиляции приложения
Доброго времени суток! При попытке компиляции на IOS устройство вылетает следующая ошибка: ...

ошибка при компиляции приложения
procedure Dialog(const captcha_sid: string); var MS: TMemoryStream; Jpg: TJPEGImage; begin...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru