Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么队列的所有元素都是相同的,元素会添加到posix线程中的队列中_C++_Synchronization_Pthreads_Queue_Mutex - Fatal编程技术网

C++ 为什么队列的所有元素都是相同的,元素会添加到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

有这样一个代码。有一个全局队列,您可以在posix线程中添加新元素,但当添加完所有元素后,我打印到屏幕队列时,所有元素都是相同的

#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
阻塞直到线程完成。因此,您的程序创建一个线程,等待它完成,然后再启动下一个线程,依此类推。您应该y
join
在一个单独的循环中。我签入GDB时,每次生成的值都不同,所以我认为这里的问题不在于sr,可能与
GDB
有关,它比较慢。您是否尝试过将
srand
调用移动到main?我有。