Szukałem nazwanego mutex, abym mógł zapewnić wzajemne wykluczanie przez cały okres procesu (upewniając się tylko jeden zakonczeniu za pewien zestaw właściwości). Nie znalazłem jednego (wygląda na to, że mogłem nie wyglądać wystarczająco mocno), więc zaimplementowałem swój własny pseudo-mutex w linuxie używając abstrakcyjnego gniazda domeny UNIX. Tylko pojedyncze wiązanie() do tego gniazda zakończy się pomyślnie. Inną dobrą rzeczą jest to, że system operacyjny oczyści abstrakcyjne gniazdo domeny UNIX, jeśli proces zginie, a tym samym nie oczyści samego gniazda.Niestety nie jestem pewien, w jaki sposób można "czekać" na ten pseudo mutex, aby stać się dostępny.
Abstrakcyjne gniazdo domeny UNIX to gniazdo domeny UNIX, którego nazwa rozpoczyna się od pustego bajtu. Uważaj jednak, uważam, że cały bufor jest używany jako nazwa, a więc chcesz się upewnić, że nie tylko zapiszesz w nim ciąg lub wprowadzisz do niego częściowy ciąg, czy też upewnisz się, że najpierw wypełnisz cały bufor pewną postacią .
Wszystkie oprócz pierwszego wiązania() zawiedzie z errno EADDRINUSE.
// Create an abstract socket to use as a mutex.
int err;
int mutex_sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (mutex_sock == -1)
{
err = errno;
printf("main, failed creating mutex socket: %s\n",
get_error_string(errno, error_string, sizeof(error_string)));
log_event(LOG_LEVEL_ERROR, "main, failed creating mutex socket: "
"%s", get_error_string(errno, error_string,
sizeof(error_string)));
errno = err;
goto done;
}
// Bind to abstract socket. We use this as a sort of named mutex.
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path + 1, socket_name, sizeof(addr.sun_path) - 2);
result = bind(mutex_sock, (struct sockaddr*) &addr, sizeof(addr));
if (result == -1)
{
err = errno;
if (errno == EADDRINUSE)
{
printf("main, failed bind to mutex socket: %s. "
"Another instance must be running.\n",
get_error_string(errno,
error_string, sizeof(error_string)));
log_event(LOG_LEVEL_ERROR, "main, failed bind to mutex socket: "
"%s. "
"Another instance must be running.",
get_error_string(errno,
error_string, sizeof(error_string)));
}
else
{
printf("main, failed bind to mutex socket: %s\n",
get_error_string(errno, error_string,
sizeof(error_string)));
log_event(LOG_LEVEL_ERROR, "main, failed bind to mutex socket: %s",
get_error_string(errno, error_string,
sizeof(error_string)));
}
errno = err;
goto done;
}
Dzięki Nick
Zależy co masz na myśli przez "multiprzetwarzania". Jeśli przejdziesz przez definicję stackoverflow, to wieloprocesowość będzie obejmować wielowątkowość. Jeśli masz na myśli "wiele procesów", masz rację. –
Zobacz http://stackoverflow.com/a/28479697/2189128 – Jeff