У меня есть два вопроса, которые похожи из-за того, что код почти одинаков. Я новичок ie в использовании потоков, но я не новичок в идее и концепции, но я не могу заставить это работать ...
Задача, создать два потока (плюс основной), который печатает Привет луна три раза с короткой задержкой и одна, которая печатает привет мир с большой задержкой три раза, один за другим.
Первая версия кода вызвала проблему, из-за которой main иногда закрывалась до того, как потоки сделали свое дело, хотя Я использую соединения. Это код:
Обновление: использование pthread_join (& ....); не очень хорошая идея Я должен был использовать pthread_join (...); (без &) эта часть работает, как и сейчас.
#include <stdio.h>
#include <stdlib.h>
#include "wrapper.h"
#include <pthread.h>
#include <sys/time.h>
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *HelloMoon (void * arg){
pthread_mutex_lock(&mutex);
struct timeval stop, start;
int i = 0;
gettimeofday(&start, NULL);
while(i < 3){
gettimeofday(&stop, NULL);
if((stop.tv_usec-start.tv_usec)>=20000){
printf("Hello Moon!\n");
gettimeofday(&start, NULL);
i++;
}
}
pthread_mutex_unlock(&mutex);
return NULL;
}
void *printHelloWorld(void* arg){
pthread_mutex_lock(&mutex);
struct timeval stop, start;
int i = 0;
gettimeofday(&start, NULL);
while(i < 3){
gettimeofday(&stop, NULL);
if((stop.tv_sec-start.tv_sec)>=1){
printf("Hello world!\n");
gettimeofday(&start, NULL);
i++;
}
}
pthread_mutex_unlock(&mutex);
return(NULL);
}
int main(int ac, char * argv)
{
pthread_t thread_id1, thread_id2;
pthread_create(&thread_id2, NULL, HelloMoon, NULL);
pthread_create(&thread_id1, NULL, printHelloWorld, NULL);
pthread_join(&thread_id2, NULL);
pthread_join(&thread_id1, NULL);
return(0);
}
Этот второй код использует в основном время while l oop, чтобы поведение повторялось вечно. Это «решает» проблему основного выхода, но иногда один поток запускается дважды, заставляя его печатать 6 раз вместо трех. Это почему? Код:
Обновление: я думаю, это потому, что l oop создает два новых потока при каждом запуске, что делает общее количество потоков больше двух, и это, в свою очередь, имеет несколько потоков с одинаковым id приводит к этому забавному поведению. Я прав или нет?
int main(int ac, char * argv)
{
pthread_t thread_id1, thread_id2;
while(1==1){
pthread_create(&thread_id2, NULL, HelloMoon, NULL);
pthread_create(&thread_id1, NULL, printHelloWorld, NULL);
pthread_join(&thread_id2, NULL);
pthread_join(&thread_id1, NULL);
}
return(0);
}
Последние вопросы, каков наилучший способ заставить потоки работать один за другим вечно? В то время как l oop хорошая идея? Являются ли переменные "i" одинаковыми для потоков? Я думаю, что нет, но один источник сказал, что это так, поэтому я хочу быть уверен.