Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ПОМОГИТЕ ПОЖАЛУЙСТА ПРОЧИТАТЬ ПРОГРАММУ, НАПИСАТЬ, Программа для ОС - о потоках 
:(
    Опции темы
jonikmmm
  Дата 4.12.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 4.12.2011

Репутация: нет
Всего: нет



Здравствуйте! Пожалуйста помогите разобраться с программой дубовиком.... мне нужно сдавать лабораторную, а я не знаю, что там и как....)))Об оплате договоримся... Нужно либо псевдо код написать либо в комментариях что и как работает, а еще потом по телефону объяснить или по скайпу...буду очень благодарен! Нужно срочно...Прикрепляю код:

Код

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QString>

#include <pthread.h>
#include <unistd.h>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <ctime>
#include <cstdlib>
#include <cerrno>
#include <cstring>

using namespace std;
namespace{


vector<string> names;
vector<pthread_t> thr1, thr2;
pthread_t main;
QString ostring;

struct Info{
int NThreads;
class Widget *that;
}myInfo;


class make_string{
private:
std:stringstream buffer;
public:
template<typename T>
make_string& operator << (T const &datum){
buffer<<datum;
return *this;
}
operator std::string() const{
return buffer.str();
}

};

void postMessage(const string& message){
QString result = ostring+message.c_str();
ostring=result;
cout<<message.c_str();
}

void postError(pthread_t thread, int result){
if(result) postMessage(make_string()<<"Thread "<<thread<<" exit with an error: "<<strerror(result));
}

void *thread1(void *p)
{
string name = make_string()<<pthread_self();
int ip = *(reinterpret_cast<int*>(p));
names[ip] = name;
ofstream out(name.c_str());
int x = rand()%100+1;
for (int i = 0; i<x; i++) out << "s";
out.close();
time_t timer = time(0);
string message = make_string()<<"Hi, I am odd thread with ID = "<<static_cast<unsigned int>(pthread_self())<<", PID = "<< getpid()<<", PPID = "<<getppid()<<", TIME = "<< ctime(&timer)<<"FileName = "<<name<<", Number of written symbols = "<<x<<"\n\n";
postMessage(message);
return NULL;
}

void *thread2(void *p)
{
int ip = *(reinterpret_cast<int*>(p));
pthread_join(thr1[ip], NULL);
ifstream in(names[ip].c_str());
int a = 0;
char temp;
while(!in.eof())
{
in >> temp;
a++;
}
in.close();
time_t timer = time(0);
string message = make_string()<<"Hi, I am even thread with ID = "<<static_cast<unsigned int>(pthread_self())<<", PID = "<< getpid()<<", PPID = "<<getppid()<<", TIME = "<< ctime(&timer)<<"FileName = "<<names[ip]<<", Number of read symbols = "<<a<<"\n\n";
postMessage(message);
return NULL;
}
void * anotherMain(void *)
{
ostring="";
int NPairs = myInfo.NThreads;
thr1.resize(NPairs);
thr2.resize(NPairs);
names.resize(NPairs);
for (int i = 0; i<NPairs; i++)
{
if(pthread_create (&thr1[i], NULL, thread1, &i)<0)
{
postMessage(make_string()<<"Cannot create odd thread\n");
printf("Cannot create odd thread");
continue;
}
if(pthread_create (&thr2[i], NULL, thread2, &i)<0){
postMessage(make_string()<<"Cannot create even thread\n");
pthread_join(thr1[i], NULL);
}else{
pthread_join(thr2[i],NULL);
}
}
return NULL;
}
}
Widget::Widget(QWidget *parent)
: QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
ui->input->setInputMask("9;");
}

Widget::~Widget()
{
delete ui;
}

void Widget:n_startButton_clicked(){
bool a;
int NThreads =ui->input->text().toInt(&a);

if(a){
myInfo.NThreads=NThreads;
myInfo.that=this;
pthread_create(&main, NULL, anotherMain,NULL);
pthread_join(main, NULL);
postMessage(ostring);
}
}
void Widget:ostMessage(const QString& message){
QString output = ui->output->toPlainText()+message;
ui->output->setPlainText(output);
}
void Widget:n_clearButton_clicked(){
ui->output->clear();
}


 
Результаты работы программы

Hi, I am odd thread with ID = 3067411312, PID = 2418, PPID = 2385, TIME = Wed Mar 24 02:04:26 2010
FileName = 3067411312, Number of written symbols = 6

Hi, I am even thread with ID = 3059018608, PID = 2418, PPID = 2385, TIME = Wed Mar 24 02:04:26 2010
FileName = 3067411312, Number of read symbols = 7

Hi, I am odd thread with ID = 3059018608, PID = 2418, PPID = 2385, TIME = Wed Mar 24 02:04:26 2010
FileName = 3059018608, Number of written symbols = 52

Hi, I am even thread with ID = 3067411312, PID = 2418, PPID = 2385, TIME = Wed Mar 24 02:04:26 2010
FileName = 3059018608, Number of read symbols = 53



Вот еще один дубовика с заданием:

Задания на лабораторную работу:
1. Запустите несколько раз программу, приведенную в примере 6. Объясните письменно:
1) Результат работы программы.
2) Почему при запуске программы несколько раз и при увеличении числа потоков
(NKIDS) получаются различные результаты?

2. Напишите программу, в которой:
1) запускается четное количество потоков;
2) каждый нечетный поток (например, первый) создает файл с именем из своего PID,
записывает в него произвольное число символов и закрывает этот файл;
3) каждый четный поток (например, второй) открывает файл, созданный предыдущим
потоком с нечетным номером (в нашем случае первым), читает его, считает количе-
ство символов в файле и закрывает его;
4) каждый из потоков выводит следующую информацию: ThreadID, PID, PPID, время,
имя файла, количество записанных или считанных символов.
Количество пар создаваемых потоков передается аргументом в программу с командной
строки. Программа должна ждать завершения работы всех потоков, анализировать и сооб-
щать о причинах завершения потоков. Для передачи имен файлом между потоками можно
использовать символьный массив в основной программе.
3. Ответьте письменно на вопрос: какие атрибуты потоков реализованы в библиотеке
Pthreads (см. <pthread.h> и man pages). 
1.
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
int tot_items = 0 ;
struct kidrec
{
int data ;
pthread_t id ;
};
#define NKIDS 50
void *kidfunc(void *p)
{
int *ip = (int *)p ;
int tmp, n ;
tmp = tot_items ;
for (n = 0;n<50000;n++)
tot_items = tmp + *ip;
}
main ( )
{
kidrec kids[NKIDS] ;
int m ;
for (m=0; m<NKIDS; ++m)
{
kids[m].data = m+1 ;
pthread_create (&kids[m].id, NULL, kidfunc, &kids[m].data);
}
for (m=0; m<NKIDS; ++m)
pthread_join (kids[m].id, NULL) ;
printf ("End of Program. Grand Total = %d\n", tot_items) ;
} 
2. 
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <memory.h>
#include <sys/types.h>

void *rThreadFun(void *p);
void *wThreadFun(void *p);

class Buffer
{
    public:
        int num;
        int in;
        int out;
        int finin;
        int finout;
};

int main(int argc, char* argv[])
{
    srand48(time(NULL));
    if(argc!=2)
    {
        printf("Error\n");
        return 1;
    }
    int countp;
    sscanf(argv[1],"%d",&countp);
    if(countp>100)
    {
        printf("Error\n");
        return 1;
    }
    int i,j,k;
    pthread_t *wThreads=new pthread_t[countp];
    pthread_t *rThreads=new pthread_t[countp];
    Buffer *wBuffers=new Buffer[countp];
    Buffer *rBuffers=new Buffer[countp];
    bool *wRes=new bool[countp];
    bool *rRes=new bool[countp];
    memset(wRes,1,countp);
    memset(rRes,1,countp);
    int *tpipe=new int[2];
    int wi=0;
    int ri=0;
    for(i=0,j=0; i<countp; i++)
    {
        pipe(tpipe);
        wBuffers[i].num=j++;
        wBuffers[i].out=tpipe[0];
        wBuffers[i].in=tpipe[1];
        rBuffers[i].num=j++;
        rBuffers[i].out=tpipe[0];
        rBuffers[i].in=tpipe[1];
        lrand48();
        pthread_create(&wThreads[i],NULL,wThreadFun,&(wBuffers[i]));
        lrand48();
        pthread_create(&rThreads[i],NULL,rThreadFun,&(rBuffers[i]));
    }
    for(i=0; i<countp; i++)
    {
        pthread_join(wThreads[i],NULL);
        pthread_join(rThreads[i],NULL);
    }
    delete []wRes;
    delete []rRes;
    delete []tpipe;
    delete []wThreads;
    delete []rThreads;
    delete []wBuffers;
    delete []rBuffers;
    return 0;
}

void *wThreadFun(void *p)
{
    int r=lrand48();
    int pid;
    if(pid=fork()==0)
    {
        srand48®;
        Buffer *buffer=(Buffer*)p;
        close(buffer->out);
        time_t now;
        int i;
        unsigned char rnd;
        unsigned int sum=0;
        int index=buffer->num>>1;
        unsigned int tid=pthread_self();
        char *name=new char[11];
        memset(name,0,11);
        sprintf(name,"%u",tid);
        write(buffer->in,name,11);
        int file=creat(name,S_IRUSR|S_IWUSR);
        int count=lrand48()%200;
        flock sflock;
        sflock.l_type=F_WRLCK;
        sflock.l_whence=SEEK_SET;
        sflock.l_start=0;
        sflock.l_len=0;
        fcntl(file,F_SETLK,&sflock);
        char temp=1;
        write(buffer->in,&temp,1);
        for(i=0; i<count; i++)
        {
            sum+=rnd=rand();
            write(file,&rnd,1);
            sflock.l_start++;
            fcntl(file,F_SETLK,&sflock);
        }
        sflock.l_type=F_UNLCK;
        sflock.l_start=0;
        fcntl(file,F_SETLK,&sflock);
        close(file);
        write(buffer->in,&temp,1);
        printf("num: %d, ",buffer->num);
        printf("ID: %u, ",tid);
        printf("PID: %d, ",getpid());
        printf("PPID: %d, ",getppid());
        printf("fname: %s, ",name);
        printf("count: %d, ",count);
        printf("sum: %d, ",sum);
        time(&now);
        printf("time: %s",ctime(&now));
        delete []name;
        return 0;
    }
    waitpid(pid,NULL,NULL);
    pthread_exit(0);
}

void *rThreadFun(void *p)
{
    int r=lrand48();
    int pid;
    if(pid=fork()==0)
    {
        srand48®;
        Buffer *buffer=(Buffer*)p;
        close(buffer->in);
        char *name=new char[11];
        read(buffer->out,name,11);
        time_t now;
        unsigned int sum=0;
        unsigned char buf;
        flock sflock;
        sflock.l_type=F_RDLCK;
        sflock.l_whence=SEEK_SET;
        sflock.l_start=0;
        sflock.l_len=1;
        int index=buffer->num>>1;
        unsigned int tid=pthread_self();
        int count=0;
        char temp;
        read(buffer->out,&temp,1);
        int file=open(name,O_RDONLY);
        while(true)
        {
            fcntl(file,F_SETLKW,&sflock);
            if(read(file,&buf,1))
            {
                count++;
                sum+=buf;
                sflock.l_start++;
            }
            else break;
        }
        close(file);
        read(buffer->out,&temp,1);
        unlink(name);
        printf("num: %d, ",buffer->num);
        printf("ID: %u, ",tid);
        printf("PID: %d, ",getpid());
        printf("PPID: %d, ",getppid());
        printf("fname: %s, ",name);
        printf("count: %d, ",count);
        printf("sum: %d, ",sum);
        time(&now);
        printf("time: %s",ctime(&now));
        delete []name;
        return 0;
    }
    waitpid(pid,NULL,NULL);
    return 0;
} 
3.
1.    Scope – область действия
a.    PTHREAD_SCOPE_SYSTEM поток планируется системным планировщиком и соревнуется за системные ресурсы с другими процессами
b.    PTHREAD_SCOPE_PROCESS поток планируется пользовательским планировщиком и, с точки зрения системы, считается частью своего процесса
2.    Detachstate – присоединён/неприсоединён
a.    PTHREAD_CREATE_JOINABLE - ресурсы потока освобождаются после того, как другая нить вызовет pthread_join()
b.    PTHREAD_CREATE_DETACHED - ресурсы потока освобождаются сразу после завершения потока.
3.    Stacksize - размер стека в байтах
a.    Размер стека в байтах
b.    0 - система сама определяет размер стека. 
4.    Stackaddr - адрес стека
a.    Указатель на область памяти достаточную для размещения стека
b.    NULL - система должна выделить область под стек при создании потока
5.    Concurrency (степень параллелизма)
a.    положительные целые числа
6.    Schedpolicy - политика планирования
a.    SCHED_FIFO - соответствует планированию в порядке линейной очереди; потоки получают управление и отдают его только когда остановятся на примитиве синхронизации или вызовут sched_yield()
b.    SCHED_RR - соответствует планированию с квантами времени, когда потоки исполняются либо до момента явной отдачи управления, либо до истечения кванта времени.
c.    SCHED_OTHER соответствует системной политике планирования.
d.    TS – система оптимизирует среднее время реакции на внешние события.
e.    RT – используется статическая приоритизация. LWP реального времени исполняется до тех пор, пока не будет вытеснен LWP с более высоким приоритетом
f.    FSS – сложная схема динамической приоритизации, обеспечивающая определенным группам процессов гарантированную долю процессорного времени.
7.    Inheritsched - наследование класса планирования
a.    PTHREAD_INHERIT_SCHED – наследовать, означает, что поток наследует класс планирования и приоритет от родительского потока
b.    PTHREAD_EXPLICIT_SCHED - задавать явно, означает, что класс планирования и приоритет вновь создаваемого потока должны быть указаны явно в атрибуте schedparam
8.    Schedparam - параметры планирования
a.     struct sched_param определенная в <sched.h>, структура должна содержать поле sched_priority, соответствующее приоритету потока.
9.    Guardsize - размер сторожевой области (защищена от чтения и записи, находится в начале стека)
a.    Размер сторожевой области в байтах
b.     0 - сторожевую область выделять не надо.


Можете либо позвонить на +79243118379, если сможете помочь, либо написать на [email protected]...
 также помогите выбрать код получше с точки зрения объяснения....
PM MAIL   Вверх
Rodman
Дата 8.12.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 26
Всего: 122




M
Rodman
Модератор: Название темы должно отражать ее суть!

PM MAIL WWW Skype GTalk YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0830 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.