Создание Step4. День6 темы и темы

1. Что такое нить: нить представляет собой легкий процесс, небольшие размеры, одни и те же нити процесса разделяют одно адресное пространство, переключение между потоками меньше времени

2. Пропустите концепция Категория: Синхронизировать нить, нить взаимоисключающими (измененная в то же время предотвратить критический ресурс), PV операции нити и т.д.

3. Заправьте соответствующую команду пс -eLf просмотреть все темы, темы для компиляции подключаемой библиотеки -lpthread

4. Заправьте функцию корреляции

1) 线程 创建: INT pthread_create (pthread_t * нить, Const pthread_attr_t * атр, недействительный * (* start_routine) (недействительный *), недействительный * Arg);

                                                              TID (ошибка не может напечатать PError) нулевой поток поток атрибут обратного вызова параметр функции перехода к нити (значение может быть передано, повернуть сильный)

Тема Примечание: ① нить, которая не может быть записан выход, иначе весь процессы вышли, ②main функция выходит, вся программа завершается, поток не существует, ③ нить закрывает поток завершается, ресурсы не восстанавливаются

2) Восстановление резьбы:

pthread_join функция соответствует процессу waitpid

pthread_exit функция потока выход выход, соответствующий процессу, возвращаемое значение функции может быть принято pthread_join

3) Отмена Темы: pthead_cancel нити может отменить другой поток (не гарантируют результаты). Добавить pthread_testcancel () для обеспечения нормальной нити может быть отменена

4) нити отсоединять: INT pthread_detach (pthread_t нить), установите нить отделить свойство, поэтому поток выходит ресурсы автоматически освобождается, без использования pthread_join (pthread_self (), собственный поток TID)

Нить, связанные с демо-код

1) две нити делают разные вещи

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <SYS / types.h>
#include <SYS / stat.h>
#include <fcntl.h>
#include <время .h>
#include <unistd.h>

#define N 32

недействительный * timewrite (недействительный * Arg);
недействительный * scanfwrite (недействительный * Arg);

INT основных (INT ARGC, Const символ * ARGV [])
{

pthread_t tid1, tid2;
INT re1, п2;
RE1 = pthread_create (& tid1, NULL, timewrite, NULL);
если (RE1) {
Е ( "pthread_create 1:% s \ п", strerror (RE1));
вернуться -1;
}
П2 = pthread_create (& tid2, NULL, scanfwrite, NULL);

pthread_detach (tid1);
если (п2) {
Е ( "pthread_create 1:% s \ п", strerror (RE2));
вернуться -1;
}

Pthread_detach (tid1);
сна (60);

pthread_cancel (tid1);
pthread_cancel (tid2);

возвращать 0;
}

 

недействительный * timewrite (недействительный * Arg) {

FILE * FP;
Fp = Еореп ( "timelog.txt", "ш");
если (FP == NULL) {
PError ( "Еореп TimeLog");
возвращать NULL;
}

в то время как (1) {
time_t т = время (& т);
символ BUF [N] = {0};
зЬгср (BUF, CTime (& т));
FWRITE (BUF, 1, STRLEN (BUF), FP);
сон (1);
pthread_testcancel ();
}
}


недействительный * scanfwrite (недействительный * Arg) {

INT FD;
символ BUF [N] = {0};
FD = открыт ( "scanflog.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
если (FD <0) {
PError ( "открытый scanflog");
возвращать NULL;
}

в то время как (1) {

fgets (BUF, N, STDIN);

написать (FD, ЬиЕ, STRLEN (BUF));

pthread_testcancel ();

}

2) Блокировка нити для предотвращения потоков одновременно изменить критическую область ресурсов (тупиковый ждут другого поток своих ресурсов и избежать ТУПИКИ первого применения программы ① ② использование замка)


#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <SYS / types.h>
#include <SYS / stat.h>
#include <fcntl.h>


pthread_mutex_t замок;

недействительный * writefunc (недействительный * Arg) {
INT fd1;
символ BUF [32];
зЬгср (BUF, (символ *) Arg);

pthread_mutex_lock (& замок);
fd1 = открыт ( "log.txt", O_APPEND | O_WRONLY);
Е ( "ЬеГо =% s \ п", ЬиЙ);
написать (fd1, ЬиЕ, STRLEN (BUF));
близко (fd1);
pthread_mutex_unlock (& замок);

}

INT основных (INT ARGC, Const символ * ARGV [])
{


INT RE1, RE2;
pthread_t tid1, tid2;
символ * buf1 = "привет мир \ п";
символ * buf2 = «как вы \ п»;
INT Fd;

pthread_mutex_init (& блокировка, NULL);

FD = открыт ( "log.txt", O_CREAT | O_TRUNC, 0777);
если (FD <0) {
PError ( "открытый");
вернуться -1;
}
Близко (FD);

RE1 = pthread_create (& tid1, NULL, writefunc, (недействительными *) buf1);
если (RE1) {
Е ( "pthread_create 1:% s \ п", strerror (RE1));
вернуться -1;
}
Pthread_detach (tid1);

п2 = pthread_create (& tid1, NULL, writefunc, (недействительными *) buf2);
если (п2) {
Е ( "pthread_create 1:% s \ п", strerror (RE2));
вернуться -1;
}
Pthread_detach (tid2);

сна (10);
возвращать 0;
}

3) нить PV операций (производитель потребительской концепции)


sem_t нет;

недействительный * writefunc1 (недействительный * Arg) {
INT fd1;
символ BUF [32];
зЬгср (BUF, (символ *) Arg);

fd1 = открыт ( "log.txt", O_APPEND | O_WRONLY);
Е ( "ЬеГо =% s \ п", ЬиЙ);
написать (fd1, ЬиЕ, STRLEN (BUF));
близко (fd1);

// sem_post (& СЭМ); // выделение производственных ресурсов
}

недействительным * writefunc2 (недействительными * аг) {

// sem_wait (& СЭМ); // приложение потребление ресурсов
INT fd1;
обугливаются ЬиМ [32];
зЬгср (BUF, (символ *) Arg);

fd1 = открыт ( "log.txt", O_APPEND | O_WRONLY);
Е ( "ЬеГо =% s \ п", ЬиЙ);
написать (fd1, ЬиЕ, STRLEN (BUF));
близко (fd1);

}

ИНТ основной (интермедиат ARGC, Const символ * ARGV [])
{


INT RE1, RE2,
pthread_t TID1, TID2,
символ * из BUF1 = "Hello World \ n-",
символ * BUF2 = "Как вы \ п";
INT FD;

// sem_init (& семафор, 0,0) ; // инициализация очереди производства

FD = открыт ( "log.txt", O_CREAT | O_TRUNC, 0777);
если (FD <0) {
PError ( "открытый");
вернуться -1;
}
Близко (FD);

RE1 = pthread_create (& tid1, NULL, writefunc1, (недействительными *) buf1);
если (RE1) {
Е ( "pthread_create 1:% s \ п", strerror (RE1));
вернуться -1;
}
Pthread_detach (tid1);

п2 = pthread_create (& tid1, NULL, writefunc2, (недействительными *) buf2);
если (п2) {
Е ( "pthread_create 1:% s \ п", strerror (RE2));
вернуться -1;
}
Pthread_detach (tid2);

сна (10);
возвращать 0;
}

 

рекомендация

отwww.cnblogs.com/huiji12321/p/11319002.html