
accept_mutex는 socket programming에서 사용하는 동기화 메커니즘 중 하나로, accept() 시스템 콜을 동기화하기 위해 사용됩니다.
accept_mutex를 사용하기 위해서는 pthread_mutex_lock() 함수를 사용해야 하는데, 이 함수를 사용할 때의 문제점은 다음과 같습니다.
- accept_mutex를 사용할 때, accept() 시스템 콜이 블로킹되기 때문에, accept_mutex를 사용하는 서버는 accept() 시스템 콜이 완료될 때까지 블로킹 상태에 머물게 됩니다.
- accept_mutex를 사용할 때, accept() 시스템 콜이 실패할 경우, accept_mutex를 사용하는 서버는 에러를 반환하고, accept_mutex를 해제해야 합니다.
accept_mutex를 사용하는 예시 코드는 다음과 같습니다.
#hostingforum.kr
c
#include
#include
#include
#include
#include
#include
#include
#define PORT 8080
#define MAX_CLIENTS 5
int client_sockets[MAX_CLIENTS];
pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
void* handle_client(void* arg) {
int client_socket = (int)arg;
char buffer[256];
// Client를 처리하는 코드
recv(client_socket, buffer, 256, 0);
send(client_socket, "Hello, client!", 13, 0);
close(client_socket);
return NULL;
}
int main() {
int server_socket, client_socket;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
pthread_t thread;
// 서버 소켓 생성
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0) {
perror("socket");
exit(1);
}
// 서버 주소 설정
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
// 서버 소켓 바인딩
if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
exit(1);
}
// 서버 소켓 리스닝
if (listen(server_socket, MAX_CLIENTS) < 0) {
perror("listen");
exit(1);
}
printf("Server listening on port %d...n", PORT);
while (1) {
// accept_mutex를 사용하여 accept() 시스템 콜을 동기화
pthread_mutex_lock(&accept_mutex);
client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_len);
if (client_socket < 0) {
perror("accept");
pthread_mutex_unlock(&accept_mutex);
continue;
}
// Client를 처리하는 스레드 생성
pthread_create(&thread, NULL, handle_client, (void*)client_socket);
// accept_mutex를 해제
pthread_mutex_unlock(&accept_mutex);
}
return 0;
}
이 예시 코드에서는 accept_mutex를 사용하여 accept() 시스템 콜을 동기화하고, Client를 처리하는 스레드를 생성합니다. accept_mutex를 사용할 때, accept() 시스템 콜이 블로킹되기 때문에, accept_mutex를 사용하는 서버는 accept() 시스템 콜이 완료될 때까지 블로킹 상태에 머물게 됩니다. accept_mutex를 사용할 때, accept() 시스템 콜이 실패할 경우, accept_mutex를 사용하는 서버는 에러를 반환하고, accept_mutex를 해제해야 합니다.
2025-04-08 15:46