我有一个多线程应用程序,我需要在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 ++中实现防护。
答案 0 :(得分:1)
正如Sam Varshavchik在上面的评论中所建议的,使用POSIX std :: mutex我们可以保护多线程应用程序中的变量。
std :: mutex是一种矫枉过正,但它是我们对gcc 4.4的最佳选择。
C ++ 11 atomic在解决此问题方面做得更好,但仅在最近的编译器上可用。