ما هو الخطأ في هذه قطعة صغيرة من التعليمات البرمجية مزامنة؟

StackOverflow https://stackoverflow.com/questions/305536

  •  08-07-2019
  •  | 
  •  

سؤال

// A Mutex allows threads mutually exclusive access to a resource.
//-----------------------------------------------------------------------

class Mutex
{
private:
    CRITICAL_SECTION m_mutex;

public:
     Mutex() { InitializeCriticalSection(&m_mutex); }
    ~Mutex() { DeleteCriticalSection(&m_mutex);     }

    void acquire() { EnterCriticalSection(&m_mutex); }
    void release() { LeaveCriticalSection(&m_mutex); }
};

وباستخدام برنامج Entrek Codesnitch لتصحيح واختبار لأي تسرب الذاكرة، وما إلى ذلك، تقارير الخطأ التالي:

InitializeCriticalSection Error: lpCriticalSection (0x000387d4) points to an invalid 
  memory location (0x00018984) Mutex::Mutex in lockmutex.h, line 29

وربما كل ما عندي من الليالي الطوال والحصول في نهاية المطاف بالنسبة لي. ولكن أنا لا أفهم ما يشكو بالضبط عنه. أي أفكار؟

هل كانت مفيدة؟

المحلول

وأراهن يمكنك همية خارج واش مع :: memset (& m_mutex، 0، sizeof (m_mutex))؛ قبل الدعوة إلى الحرف الأول منه.

نصائح أخرى

وCodeSnitch على ما يبدو ليس ذكي بما فيه الكفاية لمعرفة أن InitializeCriticalSection () <م> تتوقع للعمل على هيكل يحتوي على مؤشر غير مهيأ.

واعتقد انه من وجهة CodeSnitch وجهة نظر. ما هو الفرق بين ما تفعلونه، وهذا:

struct Customer {
    char * name;
};

extern void greetCustomer(Customer* c);

class CheckoutLine {
  private:
    Customer m_customer;
  public CheckoutLine() {
    greetCustomer(&m_customer);
  }
};

وهذا يبدو وسيلة أكثر مريب إلى <م> الإنسان العين، لأننا نستنتج أن greetCustomer من المحتمل ان تعتمد على m_customer يتم تهيئة، والتي من الواضح أنها لا. ولكن لغويا، وهذا بالضبط نفس التعليمات البرمجية.

وانها ربما يستحق رفع الخلل مع Entrek. InitializeCriticalSection () هو استثناء معقول لل"الهياكل يجب تهيئة قبل تمريرها إلى وظيفة" القاعدة.

وأنا لا أرى بأسا صفك <م> تعريف . حيث أنها تستخدم على الرغم من؟ ما زال من الممكن استخدام مثيل معين بشكل غير صحيح.

وتعريف Win32 ومن CRITICAL_SECTION يتضمن مؤشر إلى "البنية _RTL_CRITICAL_SECTION *. نظام التشغيل <م> قد أن تكون ذكية في تعاملها مع هذه البنية في الطرق التي تخلط بين الأداة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top