Переменная i
является общей для обоих потоков, потому что это static
. Поведение изменения переменной между несколькими потоками не определено, поэтому фактически и вывод, который вы получаете, и вывод, который вы хотите получить, являются «неправильными» в том смысле, что компилятор не обязан их передавать вам. Фактически мне удалось изменить вывод в зависимости от уровня оптимизации, который я использовал, и он, несомненно, будет отличаться в зависимости от платформы.
Если вы хотите изменить i
, вы должны использовать мьютекс:
int print_message(void *ptr)
{
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
char *mesg;
static int i=0;
int local_i;
mesg = (char *)ptr;
printf("%s\n",mesg);
if (pthread_mutex_lock(&mutex) == 0) {
local_i = ++i;
pthread_mutex_unlock(&mutex);
}
return ((void*)local_i);
}
Если вы не используете мьютекс, вы никогда не будете уверены , чтобы получить результат, который, по вашему мнению, вы должны получить.