Системный вызов clone()
(особенно флаг CLONE_VM
) не предназначен для непосредственного использования программистами приложений, создающими потоки. Это низкоуровневый интерфейс, предназначенный для авторов библиотек, создающих полную реализацию потоков. Аналогично, примитивы синхронизации для этих потоков могут быть построены поверх низкоуровневого системного вызова futex()
, но опять-таки это не предназначено для непосредственного использования программистами приложений.
Вместо этого вы должны использовать pthreads. Под pthreads используйте pthread_create()
вместо clone()
; pthread_join()
вместо wait()
; и pthread_mutex_lock()
/ pthread_mutex_unlock()
для защиты критических секций. Версия вашей программы в pthreads будет выглядеть так:
#include <stdio.h>
#include <pthread.h>
#include "error.h"
/*-------------------------------------------------------------------------*/
#define N 100000
int main(int argc, char *argv[])
{
int n = 0;
pthread_mutex_t n_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_t child1, child2;
void *Child(void *args) {
int i, temp;
for (i = 0; i < N; i++) {
pthread_mutex_lock(&n_lock);
temp = n;
temp++;
n = temp;
pthread_mutex_unlock(&n_lock);
}
return 0;
}
printf("initial n = %d\n", n);
if (pthread_create(&child1, NULL, Child, NULL) != 0)
SysError("main:pthread_create");
if (pthread_create(&child2, NULL, Child, NULL) != 0)
SysError("main:pthread_create");
pthread_join(child1, NULL);
pthread_join(child2, NULL);
printf("final n = %d\n", n);
return 0;
}
Скомпилировать с флагом -pthread
в gcc.