Ваш анализ проблемы правильный; у вас просто нет никаких гарантий, что первый созданный поток сможет прочитать i.lower до того, как данные будут изменены в следующей строке вашей основной функции. В каком-то смысле это является причиной того, почему поначалу трудно думать о многопоточном программировании.
Прямое решение вашей непосредственной проблемы состоит в том, чтобы хранить разные интервалы с разными данными и передавать отдельный поток каждому потоку, т.е.
interval i, j;
i.lower = 0; j.lower = 10;
pthread_create(&one,NULL,thread_function,&i);
pthread_create(&two,NULL,thread_function,&j);
Это, конечно, решит вашу непосредственную проблему. Но вскоре вы, вероятно, задаетесь вопросом, что делать, если вы хотите, чтобы несколько потоков фактически использовали одни и те же данные. Что если поток 1 хочет внести изменения в i, а поток 2 хочет принять это во внимание? Вряд ли было бы много смысла заниматься многопоточным программированием, если бы каждому потоку приходилось хранить свою память отдельно от других (ну, на данный момент, оставив сообщение вне картинки). Введите взаимные блокировки! Я подумал, что я хотел бы дать вам понять, что вы захотите рассмотреть эту тему раньше, чем позже, так как это также поможет вам понять основы потоков в целом и необходимые изменения в менталитете, которые сопровождают многопоточность программирования.
Кажется, я помню, что это является приличным коротким введением в pthreads, включая начало работы с пониманием блокировки и т. Д.