Я не очень силен в много-поточном программировании , поэтому предлагаю
вам посмотреть на этот код и подсказать , где могут быть подводные камни
У меня все работает , но как-то все подозрительно гладко
Имеется общий ресурс - очередь
Имеются 2 группы по пять потоков
Обе группы начинают коллективно насиловать эту очередь
Первая группа добавляет в очередь , вторая - забирает
Все написано в лучших традициях ричарда незабвенного нашего стивенса
#define MAXNITEMS 1000000
#define MAXNTHREADS 100
int nitems;
struct node* List ;
struct {
pthread_mutex_t mutex;
pthread_cond_t cond;
int nready;
int count;
long producer_sum ;
struct node* List ;
} put = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER };
struct {
pthread_mutex_t mutex;
pthread_cond_t cond;
int nready;
int count;
long consumer_sum ;
struct node* List ;
} get = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER };
void *produce(void *), *consume(void *);
int Length(char * name , struct node* head);
int Pop(struct node** headRef);
void Add(struct node** headRef, int num) ;
int main(int argc, char **argv)
{
int i, nthreads, count[MAXNTHREADS] , count2[MAXNTHREADS];
pthread_t tid_produce[MAXNTHREADS], tid_consume[MAXNTHREADS];
List = NULL ;
if (argc != 3)
{
printf("usage: prodcons2 <#items> <#threads>\n");
exit(0);
}
nitems = atoi(argv[1]);
nthreads = atoi(argv[2]);
for (i = 0; i < nthreads; i++)
{
count[i] = 0;
pthread_create(&tid_produce[i], NULL, produce, &count[i]);
count2[i] = 0;
pthread_create(&tid_consume[i], NULL, consume, &count2[i]);
}
for (i = 0; i < nthreads; i++)
{
pthread_join(tid_produce[i], NULL);
pthread_join(tid_consume[i], NULL);
printf("count[%d] = %d count2[%d] = %d\n", i, count[i], i, count2[i]);
}
printf("producer_sum =%d consumer_sum =%d\n" , put.producer_sum , get.consumer_sum); // results in len == 3
printf("producer counter =%d consumer counter =%d\n" , put.count , get.count); // results in len == 3
printf("queue length =%d\n",Length("List",List)); // results in len == 3
exit(0);
}
void * produce(void *arg)
{
for ( ; ; ) {
pthread_mutex_lock(&put.mutex);
if (put.count >= nitems) {
pthread_mutex_unlock(&put.mutex);
return(NULL); /* array is full, we're done */
}
Add(&List, put.count );
put.producer_sum +=put.count;
put.count++;
// printf("producer =%d consumer =%d\n" , put.count , get.count); // results in len == 3
pthread_mutex_unlock(&put.mutex);
pthread_mutex_lock(&get.mutex);
if (get.nready == 0)
pthread_cond_signal(&get.cond);
get.nready++;
pthread_mutex_unlock(&get.mutex);
*((int *) arg) += 1;
}
return(NULL); /* array is full, we're done */
}
void * consume(void *arg)
{
for ( ; ; ) {
pthread_mutex_lock(&get.mutex);
if (get.count >= nitems )
{
pthread_mutex_unlock(&get.mutex);
return(NULL); /* array is full, we're done */
}
if(get.count < put.count)
{
int queue = Pop(&List );
get.consumer_sum += queue;
get.count ++;
// printf("producer =%d consumer =%d\n" , put.count , get.count); // results in len == 3
*((int *) arg) += 1;
}
pthread_mutex_unlock(&get.mutex);
pthread_mutex_lock(&put.mutex);
if (put.nready == 0)
pthread_cond_signal(&put.cond);
put.nready++;
pthread_mutex_unlock(&put.mutex);
}
return(NULL);
}

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Реализовать последовательно-параллельный запуск потоков (2017)
- Форум Структура epoll сервера (2010)
- Форум pthread_cond_wait помогите разобраться (2006)
- Форум Помогите разобраться с многопоточностью (2014)
- Форум pthread_cond_timedwait (2005)
- Форум класс list в c++ (2015)
- Форум pthread arg address confusing (2015)
- Форум Ошибка в коде... (2006)
- Форум Как правильно запустить bash script в новом потоке? (2016)
- Форум Планирование потоков в NPTL (2007)