Напоминаем, что если необходимый Вам файл был удален с сервера DepositFiles (за исключением просьбы автора), то Вы можете написать в комментарии о необходимости в данном файле. В ближайшее время он будет перезалит (при возможности на сервер сайта).
Рассмотрим простую задачу, наглядно показывающую как работать с потоками, используя mutex. Задача довольна проста. Есть один общий счетчик и пять потоков. Каждый поток уменьшает данный счетчик на единицу, спит секунду и повторяет свои действия. Выполнение операций продолжается до тех пор, пока счетчик не будет равен нулю.
int p=12; // Наш счетчик int flag[5]; // Служит для вывода на экран сообщения какой поток // уменьшил счетчик на единицу pthread_t thread[5]; // Объявляем пять потоков pthread_mutex_t mutex; // Объявляем mutex
void*potok(void*arg) // Функция потока { int j = (int) arg; flag[j-1]=j; while(p>0) { pthread_mutex_lock(&mutex); // Блокируем mutex if(p>0) { int k = p-1; printf("P(%d)=%d\n",flag[j]+1,k); p = k; } pthread_mutex_unlock(&mutex); // Освобождаем mutex sleep(1); // Спим секунду } }
int main() { int i; pthread_mutex_init(&mutex,NULL); // Инициализация mutex for(i=0;i<5;i++) pthread_create(&thread[i],NULL,potok,(void*)i); for(i=0;i<5;i++) pthread_join(thread[i],NULL); // Ждем выполнения потоков, так как функция // main завершается раньше чем потоки return 0; }
pthread_mutex_t mut; // наш мутех int count=100; // наш глобальный счетчег
void *func(void *argc){ // то, что запускаем в потоке while (count>0) { pthread_mutex_lock(&mut); printf("%d by %d thread\n", count, (int)argc); // выводит счетчег и id потока count--; pthread_mutex_unlock(&mut); sleep(1); } return NULL; }
int main(int argc, char **argv){ pthread_t threads[THREADS]; // масив дескрипторов потоков int i=0; pthread_mutex_init(&mut, NULL); for (;i<THREADS;i++){ pthread_create(&threads[i],NULL, func, (void *)i); // запускать потоки! } for (i=0;i<THREADS;i++){ pthread_join(threads[i], NULL); // ждать завершения всех потоков } printf("count=%d\n",count); // выведет наш счетчег, он должен быть равен 0 return 0; }
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]