我想讓pthreads一次運行多個實例的功能,以提高運行速度和效率。我的代碼應該產生線程,並在隊列中有更多項目時保持打開狀態。然後這些線程應該做'某事'。代碼應該要求「繼續?」當隊列中沒有更多項目時,如果我輸入「yes」,則應將項目添加到隊列中,並且線程應繼續執行「某事」。這是我到目前爲止,問題與pthreads_cond_wait和排隊pthreads
# include <iostream>
# include <string>
# include <pthread.h>
# include <queue>
using namespace std;
# define NUM_THREADS 100
int main ();
queue<int> testQueue;
void *checkEmpty(void* arg);
void *playQueue(void* arg);
void matrix_exponential_test01 ();
void matrix_exponential_test02 ();
pthread_mutex_t queueLock;
pthread_cond_t queue_cv;
int main()
{
pthread_t threads[NUM_THREADS+1];
pthread_mutex_init(&queueLock, NULL);
pthread_cond_init (&queue_cv, NULL);
for(int i=0; i < NUM_THREADS; i++)
{
pthread_create(&threads[i], NULL, playQueue, (void*)NULL);
}
string cont = "yes";
do
{
cout<<"Continue? ";
getline(cin, cont);
pthread_mutex_lock (&queueLock);
for(int z=0; z<10; z++)
{
testQueue.push(1);
}
pthread_mutex_unlock (&queueLock);
}while(cont.compare("yes"));
pthread_mutex_destroy(&queueLock);
pthread_cond_destroy(&queue_cv);
pthread_exit(NULL);
return 0;
}
void* checkEmpty(void* arg)
{
while(true)
{
pthread_mutex_lock (&queueLock);
if(!testQueue.empty()){
pthread_cond_signal(&queue_cv);}
pthread_mutex_unlock (&queueLock);
}
pthread_exit(NULL);
}
void* playQueue(void* arg)
{
while(true)
{
pthread_cond_wait(&queue_cv, &queueLock);
pthread_mutex_lock (&queueLock);
if(!testQueue.empty())
{
testQueue.pop();
cout<<testQueue.size()<<endl;
}
pthread_mutex_unlock (&queueLock);
}
pthread_exit(NULL);
}
所以我的問題在於一個事實,即代碼進入僵局,我不能找出其中的問題發生。我沒有多線程經驗,所以我很容易在這裏犯錯。我也在Windows上運行它。
當'pthread_cond_wait'回報,鎖已被收購。所以你不應該用'pthread_mutex_lock'立即重新鎖定它。 – Brian 2014-08-28 20:58:39