在旧的C ++编译器中进行防护

时间:2016-06-02 02:02:51

标签: c++ multithreading atomic c++98

我有一个多线程应用程序,我需要在gcc 4.4上编译,我不允许使用c ++ 0x标志。

我希望变量以原子方式运行但不幸的是没有C ++ 0x标志我无法在C ++中使用var array: [JSON] = [] func getTask(onCompletion: () -> (), onError: ((NSError) -> ())? = nil) { guard let endPoint = Data.sharedInstance.weeklyEndpoint else { print("Empty endpoint"); return } Alamofire.request(.GET, endPoint, encoding: .JSON) .validate() .responseJSON { response in switch response.result { case .Success: if let value = response.result.value { let json = JSON(value) for (_,subJson):(String, JSON) in json { if let date = subJson["start_date"].string{ self.date = date } if let building = subJson["building_name"].string{ self.building = building } if let jobId = subJson["schedule_job_id"].int { self.jobIdArray.append(jobId) } if let tasks = subJson["tasks"].array{ Tasks.sharedInstance.datas = tasks for building in tasks { if let ratings = building["safety_ratings"].array{ print(ratings) self.array.append(ratings) } } } } onCompletion() } case .Failure(let error): print("Request failed with error: \(error)") onError?(error) } } }

我试过了atomic<T>,但它给我一个错误说

  

ISO C ++禁止声明没有类型的“原子”

在这些条件下是否还有其他方法可以实现原子性,我可以使用fencing - 如果是,那么是否有指南或常用命令在旧C ++中实现防护。

1 个答案:

答案 0 :(得分:1)

正如Sam Varshavchik在上面的评论中所建议的,使用POSIX std :: mutex我们可以保护多线程应用程序中的变量。

std :: mutex是一种矫枉过正,但它是我们对gcc 4.4的最佳选择。

C ++ 11 atomic在解决此问题方面做得更好,但仅在最近的编译器上可用。