C++ 为什么队列的所有元素都是相同的,元素会添加到posix线程中的队列中
有这样一个代码。有一个全局队列,您可以在posix线程中添加新元素,但当添加完所有元素后,我打印到屏幕队列时,所有元素都是相同的C++ 为什么队列的所有元素都是相同的,元素会添加到posix线程中的队列中,c++,synchronization,pthreads,queue,mutex,C++,Synchronization,Pthreads,Queue,Mutex,有这样一个代码。有一个全局队列,您可以在posix线程中添加新元素,但当添加完所有元素后,我打印到屏幕队列时,所有元素都是相同的 #include <fstream> #include <iostream> #include <pthread.h> #include <queue> #include <stdlib.h> #include <string> #include <unistd.h> #includ
#include <fstream>
#include <iostream>
#include <pthread.h>
#include <queue>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include <cassert>
std::queue<int> q;
pthread_mutex_t set_queue_mutex;
void* producer(void*)
{
srand(time(NULL));
size_t m = rand() % 100 + 1;
usleep(m/1000);
size_t n = rand() % 100 + 1;
int s = q.size();
pthread_mutex_lock(&set_queue_mutex);
q.push(n);
pthread_mutex_unlock(&set_queue_mutex);
}
int main(int c, char** v)
{
int n = 0;
int m = 0;
///* Usage */
if(c == 3)
{
n = atoi(v[1]);
m = atoi(v[2]);
}
else
{
std::cout << "Wrong count of parameters, see usage: test $1 $2" << std::endl;
exit(0);
}
pthread_t* t1 = new pthread_t[n];
assert(t1 != 0);
pthread_t* t2 = new pthread_t[m];
assert(t2 != 0);
for(int i = 0; i < n; ++i)
{
pthread_create(&t1[i], 0, &producer, 0);
pthread_join(t1[i], 0);
}
while(q.size() != 0)
{
std::cout << q.front() << std::endl;
q.pop();
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
std::队列q;
pthread_mutex_t set_queue_mutex;
无效*生产者(无效*)
{
srand(时间(空));
大小m=rand()%100+1;
usleep(m/1000);
大小n=rand()%100+1;
int s=q.size();
pthread\u mutex\u lock(&set\u queue\u mutex);
q、 推(n);
pthread_mutex_unlock(&set_queue_mutex);
}
int main(int c,字符**v)
{
int n=0;
int m=0;
///*用法*/
如果(c==3)
{
n=atoi(v[1]);
m=atoi(v[2]);
}
其他的
{
std::cout您不应该调用srand()
每次。将调用移动到main
。否则,该值应仅在秒边界上更改。您的程序仍然是顺序的,因为pthread\u join
阻塞直到线程完成。因此,您的程序创建一个线程,等待它完成,然后再启动下一个线程,依此类推。您应该yjoin
在一个单独的循环中。我签入GDB时,每次生成的值都不同,所以我认为这里的问题不在于sr,可能与GDB
有关,它比较慢。您是否尝试过将srand
调用移动到main?我有。