我正在使用线程模拟许多想要预订威胁性座位的客户。每个客户(线程)应该具有唯一的ID,并且每个线程都通过结构接收一些数据(该ID包含在结构内部的数据中)。问题是,当我执行代码时,某些线程具有相同的ID,我想知道这是怎么发生的,因为要创建线程,需要进行for循环的另一次迭代,这样,thread_id为在将结构传递给新线程并创建下一个线程之前,用另一个值更新。
有人可以帮助我理解为什么出现重复值以及如何解决该问题吗?谢谢!
HLists
答案 0 :(得分:1)
我想知道这是怎么发生的,因为 被创建后,需要再次进行for循环的迭代, 的方式,在结构体之前,用另一个值更新thread_id 传递到新线程并创建下一个线程。
您即将回答自己的问题。是的,在循环的下一次迭代中,您将更新与上一个线程相同的结构的thread_id。那么如果前一个线程尚未读取其ID值,您会怎么办?答案:它可以读取下一个线程的值,而不是它自己的值。
更一般地说,您有一个数据竞赛,因为thread_id
成员在主线程和它刚刚创建的线程之间共享,它们在没有适当同步的情况下访问它, * 和一个访问是写操作。包含数据争用的程序具有未定义的行为,因此线程获取错误ID的麻烦最少。
您也许可以使用信号量在主线程和每个新线程之间提供所需的同步和排序,以使主线程不会过早或不安全地修改threadData
。但是我认为,给每个线程一个单独的ThreadData
对象,无论是动态分配的还是从它们的普通数组中分配,都会更容易,更通用。
* 尽管新线程使用互斥锁保护其访问,但这还不够。 所有访问必须使用相同的互斥保护,以提供正确的同步。而且,即使那样也不能确保所需的读写顺序。