Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Цель работы:
Изучение функций, предназначенных для синхронизации потоков в ОС
Linux.
Задачи:
Получение практических навыков использования мьютексов и условных переменных для решения задач доступа к ресурсам.
Текст программы:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t cs;
pthread_cond_t bf,be;
struct MyBuffer{
int Data;
struct MyBuffer* Next;
struct MyBuffer* Prev;
};
struct MyBuffer* bg;
struct MyBuffer* eg;
int count=0;
int Put(int Data){
if(count>=20) return -1;
struct MyBuffer* tp;
tp=(struct MyBuffer *) malloc(sizeof(struct MyBuffer));
tp->Prev=NULL;
tp->Next=NULL;
tp->Data=Data;
if(bg==NULL){
bg=tp;
eg=bg;
}
else{
eg->Next=tp;
tp->Prev=eg;
eg=tp;
}
count++;
return 0;
}
int Get(void){
int Data;
if(bg==eg)return -1;
struct MyBuffer* tp;
tp=bg;
bg=bg->Next;
Data=tp->Data;
free(tp);
count--;
return Data;
}
int Producent(void *Param){
int Data=0;
while(1){
int Time=1+(int) (2.0*rand()/(RAND_MAX+1.0))/*+500*/;
// printf("Time %d\n",Time);
sleep(Time/*/1000*/);
pthread_mutex_lock(&cs);
while(Put(Data)==-1){
pthread_cond_wait(&be,&cs);
};
pthread_cond_signal(&bf);
pthread_mutex_unlock(&cs);
Data++;
if (Data>9)Data=0;
};
}
int Consument(void *Param){
int Data=0;
while(1){
int Time=1+(int) (1500.0*rand()/(RAND_MAX+1.0))+500;
sleep(Time/1000);
printf("\n");
pthread_mutex_lock(&cs);
Data=Get();
while(Data==-1){
pthread_cond_wait(&bf,&cs);
Data=Get();
};
pthread_cond_signal(&be);
pthread_mutex_unlock(&cs);
printf("Simbol %d",Data);
};
}
int main(int argc,char* argv[]){
pthread_t ThreadProducent;
pthread_t ThreadConsument;
pthread_mutex_init(&cs, NULL);
pthread_cond_init(&bf,NULL);
pthread_cond_init(&be,NULL);
bg=NULL;eg=NULL;
Put(-1);
pthread_create(&ThreadProducent,NULL,Producent,(void *)NULL);
pthread_create(&ThreadConsument,NULL,Consument,(void *)NULL);
pthread_join(ThreadProducent,NULL);
pthread_join(ThreadConsument,NULL);
return 0;
};
Результат выполнения программы:
[diversant_@localhost Programm]$ ./laba4
Simbol 0
Simbol 1
Simbol 2
Simbol 3
Simbol 4
Simbol 5
Simbol 6
Simbol 7
Simbol 8
Simbol 9
Simbol 0
Simbol 1
Simbol 2
Ответы на вопросы:
1) Дочерний поток выполняется раньше главного
2) Главная программа остается блокированной на попытки захвата мутекса.
3) Главная программа не дожидается сигнала от переменной и зависает
Вывод:
В OC Linux созданы различные средства синхронизации потоков во много аналогичные средствам Windows Мутексы(Критические секции), Условные переменные(События), Семафоры. В OC Linux существует несколько видов синхронизации пришедшие из разных стандартов Linux, POSIX, SUN
Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.