1// 2002-01-23 Loren J. Rittle <rittle@labs.mot.com> <ljrittle@acm.org> 2// Adapted from http://gcc.gnu.org/ml/gcc-bugs/2002-01/msg00679.html 3// which was adapted from pthread1.cc by Mike Lu <MLu@dynamicsoft.com> 4// 5// Copyright (C) 2002-2015 Free Software Foundation, Inc. 6// 7// This file is part of the GNU ISO C++ Library. This library is free 8// software; you can redistribute it and/or modify it under the 9// terms of the GNU General Public License as published by the 10// Free Software Foundation; either version 3, or (at your option) 11// any later version. 12// 13// This library is distributed in the hope that it will be useful, 14// but WITHOUT ANY WARRANTY; without even the implied warranty of 15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16// GNU General Public License for more details. 17// 18// You should have received a copy of the GNU General Public License along 19// with this library; see the file COPYING3. If not see 20// <http://www.gnu.org/licenses/>. 21 22// { dg-do run { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* *-*-cygwin *-*-darwin* } } 23// { dg-options "-pthread" { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* } } 24// { dg-options "-pthreads" { target *-*-solaris* } } 25 26#include <string> 27#include <list> 28#include <pthread.h> 29 30using namespace std; 31 32static list<string> foo; 33static pthread_mutex_t fooLock = PTHREAD_MUTEX_INITIALIZER; 34static pthread_cond_t fooCondOverflow = PTHREAD_COND_INITIALIZER; 35static pthread_cond_t fooCondUnderflow = PTHREAD_COND_INITIALIZER; 36static unsigned max_size = 10; 37#if defined(__CYGWIN__) 38static int iters = 10000; 39#else 40static int iters = 300000; 41#endif 42 43void* 44produce (void*) 45{ 46 for (int num = 0; num < iters; ) 47 { 48 string str ("test string"); 49 50 pthread_mutex_lock (&fooLock); 51 while (foo.size () >= max_size) 52 pthread_cond_wait (&fooCondOverflow, &fooLock); 53 foo.push_back (str); 54 num++; 55 if (foo.size () >= (max_size / 2)) 56 pthread_cond_signal (&fooCondUnderflow); 57 pthread_mutex_unlock (&fooLock); 58 } 59 60 // No more data will ever be written, ensure no fini race 61 pthread_mutex_lock (&fooLock); 62 pthread_cond_signal (&fooCondUnderflow); 63 pthread_mutex_unlock (&fooLock); 64 65 return 0; 66} 67 68void* 69consume (void*) 70{ 71 for (int num = 0; num < iters; ) 72 { 73 pthread_mutex_lock (&fooLock); 74 while (foo.size () == 0) 75 pthread_cond_wait (&fooCondUnderflow, &fooLock); 76 while (foo.size () > 0) 77 { 78 string str = foo.back (); 79 foo.pop_back (); 80 num++; 81 } 82 pthread_cond_signal (&fooCondOverflow); 83 pthread_mutex_unlock (&fooLock); 84 } 85 86 return 0; 87} 88 89int 90main (void) 91{ 92#if defined(__sun) && defined(__svr4__) && _XOPEN_VERSION >= 500 93 pthread_setconcurrency (2); 94#endif 95 96 pthread_t prod; 97 pthread_create (&prod, 0, produce, 0); 98 pthread_t cons; 99 pthread_create (&cons, 0, consume, 0); 100 101 pthread_join (prod, 0); 102 pthread_join (cons, 0); 103 104 return 0; 105} 106