このコードは正しいですか?私はこのコードを誰かのブログで見ると、volatileは1人の顧客と1人のプロデューサーだけの環境で安全だと言いました。スレッドセーフなのかどうかはわかりません。揮発性変数は、ある顧客スレッドと1つのプロデューサスレッドで安全ですか?
コードは以下の通りです:
#include <iostream>
#include <pthread.h>
template<class QElmType>
struct qnode
{
struct qnode *next;
QElmType data;
};
template<class QElmType>
class queue
{
public:
queue() {init();}
~queue() {destroy();}
bool init()
{
m_front = m_rear = new qnode<QElmType>;
if (!m_front)
return false;
m_front->next = 0;
return true;
}
void destroy()
{
while (m_front)
{
m_rear = m_front->next;
delete m_front;
m_front = m_rear;
}
}
bool push(QElmType e)
{
struct qnode<QElmType> *p = new qnode<QElmType>;
if (!p)
return false;
p->next = 0;
m_rear->next = p;
m_rear->data = e;
m_rear = p;
return true;
}
bool pop(QElmType *e)
{
if (m_front == m_rear)
return false;
struct qnode<QElmType> *p = m_front;
*e = p->data;
m_front = p->next;
delete p;
return true;
}
private:
struct qnode<QElmType> * volatile m_front, * volatile m_rear;
};
queue<int> g_q;
void *thread1(void * l)
{
int i = 0;
while (1)
{
g_q.push(i);
i++;
usleep(::rand()%1000);
}
return 0;
}
void *thread2(void * l)
{
int i;
while (1)
{
if (g_q.pop(&i))
std::cout << i << std::endl;
//else
//std::cout << "can not pop" << std::endl;
usleep(::rand()%1000);
}
return 0;
}
int main(int argc, char* argv[])
{
pthread_t t1,t2;
pthread_create(&t1, 0, thread1, 0);
pthread_create(&t2, 0, thread2, 0);
char ch;
while (1)
{
std::cin >> ch;
if (ch == 'q')
break;
}
return 0;
}
http://isvolatileusefulwiththreads.com/を参照してください。 –