アプリ版:「スタンプのみでお礼する」機能のリリースについて

クラスに複数のスレッドからアクセスする場合 volatile はいりますか?
例えば以下のクラスを作成する場合、

class AAAA
{
public:
AAAA() { m_data = 0; }
~AAAA() {}
void setData(int data) { m_data = data; }
int getData() { return m_data; }

int m_data;
};

以下のように volatile を付けるとコンパイルでエラーになります

volatile AAAA aaaa;
aaaa.setData(100);
エラー
error C2662: 'AAAA::setData' : 'volatile AAAA' から 'AAAA &' へ 'this' ポインターを変換できません。変換で修飾子が失われます。

どのように対処すればよいですか、それとも volatile は不要でしょうか

A 回答 (2件)

その aaaa を volatile とする必要があるかどうかは, わたしには (というかあなた以外の誰にも) わかりません. 必

要ならメンバー関数に volatile 修飾子を付けてください.
    • good
    • 0
この回答へのお礼

回答ありがとうございます

メンバ関数にvolatileをつけたら動きました。

お礼日時:2016/10/16 19:47

大事なのは次の点です。


複数スレッドからアクセスされることを想定していないクラスのオブジェクトに単にvolatileを付けただけでは使い物にならないし、使えるように無理に修正しても複数スレッドからのアクセスの安全性を保証できない。

何にせよvolatileは元々複数スレッドからのアクセスを想定して用意されたものではないし、マルチスレッドならそれ用の同期機能を使うのが正解でしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ちょっと内容がよくわかりません、知見を得るためにもう少し調べてみます

お礼日時:2016/10/16 19:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!