Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
6 / 5 / 1
Регистрация: 06.09.2015
Сообщений: 176

Многопоточность, потоки, threard, pthread_t,pthread_mutex_lock/unlock, pthread_create

27.07.2018, 16:32. Показов 999. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите где можно на понятных примерах, на пальцах разобрать работу с потоками желательно на основе сетевого программирования.
совсем мозги вскипели, не могу понять вот такую программку:

Программа работает и довольно неплохо, но понять ее очень трудно, я умею только отправлять получать сообщения с клиента на сервер (и то, всегда по желанию клиента), а здесь два клиента общаются

клиент:
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
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
void *recvmg(void *sock)
{
int their_sock = *((int *)sock);
char msg[500];
int len;
while((len = recv(their_sock,msg,500,0)) > 0) {
msg[len] = '\0';
fputs(msg,stdout);
memset(msg,'\0',sizeof(msg));
}
}
int main(int argc, char *argv[])
{
struct sockaddr_in their_addr;
int my_sock;
int their_sock;
int their_addr_size;
int portno;
pthread_t sendt,recvt;
char msg[500];
char username[100];
char res[600];
char ip[INET_ADDRSTRLEN];
int len;
 
if(argc > 3) {
printf("too many arguments");
exit(1);
}
portno = atoi(argv[2]);
strcpy(username,argv[1]);
my_sock = socket(AF_INET,SOCK_STREAM,0);
memset(their_addr.sin_zero,'\0',sizeof(their_addr.sin_zero));
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(portno);
their_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 
if(connect(my_sock,(struct sockaddr *)&their_addr,sizeof(their_addr)) < 0) {
perror("connection not esatablished");
exit(1);
}
inet_ntop(AF_INET, (struct sockaddr *)&their_addr, ip, INET_ADDRSTRLEN);
printf("connected to %s, start chatting\n",ip);
pthread_create(&recvt,NULL,recvmg,&my_sock);
while(fgets(msg,500,stdin) > 0) {
strcpy(res,username);
strcat(res,":");
strcat(res,msg);
len = write(my_sock,res,strlen(res));
if(len < 0) {
perror("message not sent");
exit(1);
}
memset(msg,'\0',sizeof(msg));
memset(res,'\0',sizeof(res));
}
pthread_join(recvt,NULL);
close(my_sock);
 
}
и

сервер

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
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
struct client_info {
int sockno;
char ip[INET_ADDRSTRLEN];
};
int clients[100];
int n = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
void sendtoall(char *msg,int curr)
{
int i;
pthread_mutex_lock(&mutex);
 
for(i = 0; i < n; i++) {
if(clients[i] != curr) {
if(send(clients[i],msg,strlen(msg),0) < 0) {
continue;
}
}
}
pthread_mutex_unlock(&mutex);
}
 
void *recvmg(void *sock)
{
struct client_info cl = *((struct client_info *)sock);
 
char msg[500];
int len;
int i;
int j;
 
while((len = recv(cl.sockno,msg,500,0)) > 0) { //пока получаем значения;
msg[len] = '\0'; //очищаем последнее значение msg;
sendtoall(msg,cl.sockno); //выполняем отправку;
memset(msg,'\0',sizeof(msg)); //очищаем сообщение;
}
 
pthread_mutex_lock(&mutex); //блокируем поток
printf("%s disconnected\n",cl.ip); //ошибка
 
for(i = 0; i < n; i++) { 
if(clients[i] == cl.sockno) { // если значение массива равно значению дескриптора
j = i; // приравняй количество клиентов к j
while(j < n-1) { 
clients[j] = clients[j+1]; //количество клиентов равно кл+1
j++; 
}
}
}
n--;
pthread_mutex_unlock(&mutex);
}
 
int main(int argc,char *argv[])
{
 
//создаем две структуры для сокетов
 
struct sockaddr_in my_addr,their_addr;
int my_sock;
int their_sock;
 
 
 
socklen_t their_addr_size;
int portno;
pthread_t sendt,recvt;
char msg[500];
int len;
struct client_info cl;
char ip[INET_ADDRSTRLEN];
if(argc > 2) {
printf("too many arguments");
exit(1);
}
portno = atoi(argv[1]);
 
my_sock = socket(AF_INET,SOCK_STREAM,0);
 
memset(my_addr.sin_zero,'\0',sizeof(my_addr.sin_zero));
 
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(portno);
my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 
their_addr_size = sizeof(their_addr);
 
if(bind(my_sock,(struct sockaddr *)&my_addr,sizeof(my_addr)) != 0) {
perror("binding unsuccessful");
exit(1);
}
 
if(listen(my_sock,5) != 0) {
perror("listening unsuccessful");
exit(1);
}
 
while(1) {
if((their_sock = accept(my_sock,(struct sockaddr *)&their_addr,&their_addr_size)) < 0) {
perror("accept unsuccessful");
exit(1);
}
 
pthread_mutex_lock(&mutex);
 
printf("%s connected\n",ip);
cl.sockno = their_sock;
strcpy(cl.ip,ip);
clients[n] = their_sock;
n++;
pthread_create(&recvt,NULL,recvmg,&cl);
 
pthread_mutex_unlock(&mutex);
}
return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2018, 16:32
Ответы с готовыми решениями:

потоки (pthread_create) И exec()
Всем добрый день! Пишу лабу и возникла такая проблемам: Мне необходимо в новом потоке с помощью exec() функции вызвать некую другую...

Потоки - многопоточность в C#
Добрый день.....помогите кто с проблемой...у меня есть 3-формы... я хочу из 3-тей формы управлять первой(3-тья форма с настройками...) мне...

Разбить коллекция на потоки(Многопоточность)
Добрый день всем! У меня есть коллекция из 20 объектов и 6 потоков. Вопрос : Как сделать так что бы объекты из коллекций брались и...

2
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
03.08.2018, 10:52
Программер, совершенно честно скажу, ничерта у тебя не получится с таким подходом. Ведь совершенно очевидно, что основная сложность здесь не в потоках и не в сетевом программировании, а в том, что в коде все навалено в кучу. Поэтому даже если ты в этом конкретном коде разберешься, то, как только встретится такой же, опять застрянешь. Потому что разбираться надо не хитросплетениях конкретного говнокода, а в принципе. Так вот, в литературе описывается инструмент: "можно сделать это", "можно то" и его условия применимости. А дальше твоя задача как разработчика провести декомпозицию на сущности и написать код.
Веду к тому, что никакой такой литературы, где на пальцах эта тема описывается - нет. Можно на пальцах разобрать конкретный пример, но понимания в целом это не добавит.
Поэтому читай про сетевое программирование у Р. Стивенса, а по pthreads можно почитать в недавно изданной на русском книге М. Керриска, или у того же Стивенса, в книге по разработке под UNIX. А как из этого написать клиент-серверное приложение ты придумаешь сам, после того как освоишь методологии проектирования ПО (можно почитать Р. Мартина, С. Макконела).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2018, 16:46
Цитата Сообщение от Программер Посмотреть сообщение
на пальцах разобрать работу с потоками желательно на основе сетевого программирования
Это как раз-таки и НЕ желательно. Люди отдельно учатся ездить на велосипеде и отдельно учатся жонглировать. А если сразу же начать учиться жонглировать на велосипеде, то ничего не получится
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.08.2018, 16:46
Помогаю со студенческими работами здесь

Многопоточность. Потоки выполняются по очереди
Написал простую программу, для наглядности многопоточности. package com.company; class MyThread implements Runnable { String...

Многопоточность. Потоки работают не в том порядке
Здравствуйте, сейчас изучаю многопоточность в джаве и не могу понять, почему package com.example.hellworld; class test { ...

Многопоточность. Потоки пропускают элементы списка?
Начал разбираться с потоками и возник вопрос: #region ЗАГРУЗКА ФОРМЫ private void Form1_Load(object sender, EventArgs e) { ...

Многопоточность. Как остановить все потоки разом?
Сделал как тут: http://avtuh.ru/2010/10/10/delphi-videourok-mnogopotochnost-i-sinxronizaciya.html Как можно остановить разом все потоки?

Многопоточность. Как завершить неисполльзуемые потоки из главного потока
Привет. Буду рад любым идеям и замечаниям. Пишу многопоточный сокет сервер. Архитектура такая. Есть форма. На форме кнопка. Кнопка...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[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 и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru