IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Multithreading a data race C++

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
xmms
Člen
Avatar
xmms:18.9.2019 10:08

Učím se dělat vícevlkáknové aplikace, tutorial tady https://www.youtube.com/watch?…

Vysvětlujou tam použití mutexu pro příkaz cout. Zkoušel jsem místo cout požít printf a to funguje dobře i bez mutexu. Tedy moc nerozumím tomu, kdy je nutné použít mutex a kdy ne. A nechápu, proč se musí zamknout zrovna cout().

Zkusil jsem:

#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include <arpa/inet.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close
#include<pthread.h>

//https://dzone.com/articles/parallel-tcpip-socket-server-with-multi-threading

char client_message[2000];
char buffer[1024];
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void * socketThread(void *arg)
{
        int newSocket = *((int *)arg);
        recv(newSocket, client_message, 2000, 0);
        // Send message to the client socket
        pthread_mutex_lock(&lock);
        char *message = malloc(sizeof(client_message) + 20);
        strcpy(message, "Hello Client : ");
        strcat(message, client_message);
        strcat(message, "\n");
        strcpy(buffer, message);
        free(message);
        pthread_mutex_unlock(&lock);
        sleep(1);
        send(newSocket, buffer, 13, 0);
        printf("Exit socketThread \n");
        close(newSocket);
        pthread_exit(NULL);
}
int main() {
        int serverSocket, newSocket;
        struct sockaddr_in serverAddr;
        struct sockaddr_storage serverStorage;
        socklen_t addr_size;
        //Create the socket.
        serverSocket = socket(PF_INET, SOCK_STREAM, 0);
        // Configure settings of the server address struct
        // Address family = Internet
        serverAddr.sin_family = AF_INET;
        //Set port number, using htons function to use proper byte order
        serverAddr.sin_port = htons(7799);
        //Set IP address to localhost
        serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        //Set all bits of the padding field to 0
        memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
        //Bind the address struct to the socket
        bind(serverSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr));
        //Listen on the socket, with 40 max connection requests queued
        if (listen(serverSocket, 50) == 0)
                printf("Listening\n");
        else
                printf("Error\n");

        pthread_t tid[60];
        int i = 0;

        while (1)
        {
                //Accept call creates a new socket for the incoming connection
                addr_size = sizeof serverStorage;
                newSocket = accept(serverSocket, (struct sockaddr *) &serverStorage, &addr_size);
                //for each client request creates a thread and assign the client request to it to process
           //so the main thread can entertain next request
                if (pthread_create(&tid[i], NULL, socketThread, &newSocket) != 0)
                        printf("Failed to create thread\n");

                if (i >= 50)
                {
                        i = 0;
                        while (i < 50)
                        {
                                pthread_join(tid[i++], NULL);
                        }
                        i = 0;
                }
        }
        return 0;
}

Chci docílit: Zajímá mě vytvoření vícevláknového TCP serveru pro windows podobný tomuto v linuxu https://dzone.com/…ti-threading

v threadu je funkce recv() a send()

V tom zdrojáku se zamyká mutexem funkce malloc, ale nemá se taky zamknout recv() a send() podobně jako se zamyká cout?

 
Odpovědět
18.9.2019 10:08
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na xmms
Martin Dráb:18.9.2019 11:00

To záleží, zda-li je příslušná funkce thread-safe (tzn. sama si případně zamykání pořeší). Na Windows bude malloc thread safe určitě, protože je implementován pomocí HeapAlloc, která thread-safe je (pokud jí to prostřednictvím druhého argumentu nezakážeš).

Vždy záleží na konkrétní funkce a měl bys být schopný se tuto informaci o ní dočíst v příslušných standardech/nor­mách.

Nahoru Odpovědět
18.9.2019 11:00
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.