线程安全-一个VC下多个网络请求

一、线程安全变量控制显示隐藏loading框

问题描写叙述:

同一页面有两个异步网络请求,第一个请求開始,loading旋转。第二个请求開始loading旋转。第一个结束,loading停止旋转,但是这时第二个请求还没有结束。然后loading就结束了,于是问题就来了。

解决方式:

二、由上面问题引申出的问题:

1.
#import <libkern/OSAtomic.h>

这段话是从网上copy过来的。总结了一下原子操作的作用。

可是文中提到的osbase.h文件找不到。可能是由于版本号升级我的lib中没有这个文件。

iOS平台下的原子操作函数都以OSAtomic开头,使用时须要包括头文件<libkern/OSBase.h>。不同线程假设通过原子操作函数对同一变量进行操作,可以保证一个线程的操作不会影响到其它线程内对此变量的操作。由于这些操作都是原子式的。

由于原子操作仅仅能对内置类型进行操作。所以原子操作可以同步的线程仅仅能位于同一个进程的地址空间内。

转载请说明下:谢谢了。

点击打开链接(http://blog.csdn.net/a21064346/article/details/8076972)

单例方式1:

  1. + (ABAddressBook *) sharedAddressBook
  2. {
  3. static ABAddressBook * volatile __shared = nil;
  4. if ( __shared == nil )
  5. {
  6. ABAddressBook * tmp = [[ABAddressBook alloc] init];
  7. if ( OSAtomicCompareAndSwapPtr(nil, tmp, (void * volatile *)&__shared) == false )
  8. [tmp release];
  9. }
  10. return ( __shared );
  11. }

上面一段代码是创建一个 ABAddressBook的单例,为了保证在调用shareAddressBook的时候。内存中仅仅有一个且内存地址唯一(也就是说,怕其它线程訪问到这个函数,同一时候进行訪问这个单例)

volatile的作用是每次取得数值得方式是直接从内存中读取。

单例方式2:

  1. + (ILSCMPersistenceManage *)sharedInstance {
  2. @synchronized ([ILSCMPersistenceManage class]) {
  3. if (__sharedInstance) {
  4. return __sharedInstance;
  5. }
  6. __sharedInstance = [[ILSCMPersistenceManage alloc] init];
  7. return __sharedInstance;
  8. }
  9. }

二者差别:

前者:更区域数据的底层,从更深层来进行对单例的保护,并且不不过作用于指针,还有其它的数据格式。并且它并没有去阻断其它线程来对函数的訪问

后者:加锁。对代码的运行效率与前者相比要低一些。假设运用在其它数据,而这个数据被更新的速度非常快,那么效率就非常差了。

參考与学习:

1、http://southpeak.github.io/blog/2014/10/17/osatomicyuan-zi-cao-zuo/

2、http://www.cocoachina.com/industry/20130821/6842.html

3、http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/

2.OSAtomic vs OSAtomicBarrier

On Intel and uniprocessor platforms, it doesn‘t matter.

For multiprocessor PPC systems, you should always use the barrier variety of functions, unless the atomic store affects no dataother than the atomic variable.

The following would not be ok:

data_structure[y].data++;

OSAtomicIncrement32(y);

You must use a barrier here, because other threads may see data_structure as out of date.

However, if you are using an atomic variable for some purpose where it stands alone, you may omit the barrier:

// y is not used to access any other data

OSAtomicIncrement32(y);

Fine, as long as the value of y does not affect the variable of any shared data structure.

Essentially, it‘s a cache flush. You can always safely use the barrier functions, but in some cases, you may be able to improve performance by not using the barrier functions, such as if y is not used relative to
a data structure. There are probably not many cases where you can use the functions without the barrier.

3.int int32_t int64_t

这些事跨平台编程导致的;


一、数据类型特别是int相关的类型在不同位数机器的平台下长度不同。

C99标准并不规定详细数据类型的长度大小。仅仅规定级别。作下比較:

16位平台

char         1个字节8位

short        2个字节16位

int            2个字节16位

long         4个字节32位

指针         2个字节

32位平台

char         1个字节8位

short        2个字节16位

int            4个字节32位

long         4个字节

long long 8个字节

指针         4个字节

64位平台

char         1个字节

short        2个字节

int            4个字节

long         8个字节(差别)

long long 8个字节

指针        8个字节(差别)

二、编程注意事项

为了保证平台的通用性。程序中尽量不要使用long数据库型。能够使用固定大小的数据类型宏定义:

typedef signed char       int8_t

typedef short int             int16_t;

typedef int                      int32_t;

# if __WORDSIZE == 64

typedef long int              int64_t;

# else

__extension__

typedef long long int      int64_t;

#endif

三、使用int时也能够使用intptr_t来保证平台的通用性,它在不同的平台上编译时长度不同。但都是标准的平台长度,比方64位机器它的长度就是8字节,32位机器它的长度是4字节,定义例如以下:

#if __WORDSIZE == 64

typedef long int                intptr_t;

#else

typedef int                        intptr_t;

#endif

编程中要尽量使用sizeof来计算数据类型的大小

以上类型定义都有对应的无符号类型。

另外还有ssize_t和size_t各自是sign size_t和unsigned signed size of computer word size。它们也是表示计算机的字长,在32位机器上是int型,在64位机器上long型,从某种意义上来说它们等同于intptr_t和
uintptr_t。它们在stddef.h里面定义。

须要注意的是socket的accept函数在有些操作系统上使用size_t是不对的,由于 accept接收的int*类型。而size_t可能是long
int 类型。后来BSD使用sock_t来替代它。

uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型

在nesc的代码中。你会看到非常多你不认识的数据类型,比方uint8_t等。咋一看,好像是个新的数据类型,只是C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?非常多人有这种疑问。论坛上就有人问:以*_t结尾的类型是不是都是long型的?在baidu上查一下,才找到答案,这时才发觉原来自己对C掌握的太少。

那么_t的意思究竟表示什么?详细的官方答案没有找到,只是我认为有个答案比較接近。它就是一个结构的标注,能够理解为type/typedef的缩写,表示它是通过typedef定义的。而不是其他数据类型。

uint8_t。uint16_t,uint32_t等都不是什么新的数据类型,它们仅仅是使用typedef给类型起的别名。新瓶装老酒的把戏。

只是,不要小看了typedef。它对于你代码的维护会有非常好的作用。

比方C中没有bool,于是在一个软件中,一些程序猿使用int。一些程序猿使用short。会比較混乱,最好就是用一个typedef来定义。如:

typedef char bool;

一般来说,一个C的project中一定要做一些这方面的工作,由于你会涉及到跨平台。不同的平台会有不同的字长,所以利用预编译和typedef能够让你最有效的维护你的代码。为了用户的方便,C99标准的C语言硬件为我们定义了这些类型,我们放心使用就能够了。

依照posix标准。一般整形相应的*_t类型为:

1字节     uint8_t

2字节     uint16_t

4字节     uint32_t

8字节     uint64_t

时间: 2024-10-11 18:28:10

线程安全-一个VC下多个网络请求的相关文章

造轮子 | 怎样设计一个面向协议的 iOS 网络请求库

近期开源了一个面向协议设计的网络请求库 MBNetwork,基于 Alamofire 和 ObjectMapper 实现,目的是简化业务层的网络请求操作. 须要干些啥 对于大部分 App 而言,业务层做一次网络请求通常关心的问题有例如以下几个: 怎样在任何位置发起网络请求. 表单创建. 包括请求地址.请求方式(GET/POST/--).请求头等-- 载入遮罩. 目的是堵塞 UI 交互,同一时候告知用户操作正在进行. 比方提交表单时在提交按钮上显示 "菊花",同一时候使其失效. 载入进度

造轮子 | 如何设计一个面向协议的 iOS 网络请求库

最近开源了一个面向协议设计的网络请求库 MBNetwork,基于 Alamofire 和 ObjectMapper 实现,目的是简化业务层的网络请求操作. 需要干些啥 对于大部分 App 而言,业务层做一次网络请求通常关心的问题有如下几个: 如何在任意位置发起网络请求. 表单创建.包含请求地址.请求方式(GET/POST/--).请求头等-- 加载遮罩.目的是阻塞 UI 交互,同时告知用户操作正在进行.比如提交表单时在提交按钮上显示 "菊花",同时使其失效. 加载进度展示.下载上传图片

【安卓其他】Windows下的C++网络请求

工作使用了C++在Window系统上接入一个硬件平台的通信库,只能使用C++去调用他们给的dll函数,而且通信后还要把数据上报到后台服务器,所以整理了一下C++在Windows系统下网络请求方法. 第一部分 : 知识点 用到的C++基础知识点 1.C++相关 类定义 函数定义 构造函数与析构函数 #ifdef宏的使用 2.HTTP相关 http报文头 GET与POST的报文格式区别 第二部分 : 代码 贴上C++实现的网络请求代码,其实本质就是利用Socket发生Http格式报文. 1.功能声明

网络请求怎么样和UI线程交互? Activity2怎么通知Activity1 更新数据

1.网络请求怎么样和UI线程交互? 目前我的做法是,建立线程池管理网络请求线程,通过添加task来新增网络请求.所有的网络操作通过统一的request来实现,网络返回结果通过回调onError和onSuccess来实现对结果的处理(涉及到ui部分用runOnUiThread or handler通知ui更新,工程上两种都有,主要看你喜欢,不过用handler请注意内存泄露问题...) 这种做法好处就是,线程池可以避免不断开启线程导致虚耗资源,同时可以做到管理线程,自定义任务执行的顺序.统一req

ios编程之网络请求

网络请求有GET请求和POST请求,get和post实现的时候可以选择同步或者异步实现.看一个请求是GET还是POST就看网址后面有没有携带请求体. GET与POST 区别 1.get请求 请求的网址全部明文显示 安全性不高 2.get请求 请求的网址 有字符数的限制 大概255个 3.post请求 请求的网址 不光是有一个请求的网址 还可以携带请求体 这个请求体 是以NSData形式存在 安全性较高 4.post请求没有字符数的限制 GET同步和GET异步 同步请求是在请求数据的时候不能做其他

Android网络请求心路历程

HTTP请求&响应 既然说从入门级开始就说说Http请求包的结构.一次请求就是向目标服务器发送一串文本.什么样的文本?有下面结构的文本.HTTP请求包结构 例子: 1 2 3 4 5 6 7     POST /meme.php/home/user/login HTTP/1.1     Host: 114.215.86.90     Cache-Control: no-cache     Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed   

Android中的异步网络请求

本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关姿势.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家:) 1. 同步网络请求 以HTTP的GET请求为例,我们来介绍一下Android中一个基本的同步请求框架的实现.直接贴代码: public class HttpUtils { public static byte[] get(String urlString) { HttpURLConnection urlConne

iOS 开发 把握AFNet网络请求完成的正确时机

前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查阅理解后阅读本文.如果你也纠结于文中所述问题,可进行阅读希望对你有所帮助.大神无视勿喷. 在真实开发中,我们通常会遇到如下问题: 一.某界面存在多个请求,希望所有请求均结束才进行某操作. 对于这一问题的解决方案很容易想到通过线程组进行实现.代码如下: 1 2 3 4 5 6 7 8 9 10 11

Volley,小并发网络请求的好帮手

不得不说,当不了解一件事情的时候,就会像当然的认为,其很神秘.但是当真正的接触到了这些神秘的item,就不会有这种感觉了.作为一个android开发新手的我,刚接触到了Volley这个开源的网络请求框架,就瞬间被她打动了.下面我就谈一谈我对Volley的一些理解. Volley是什么? Volley是谷歌在2013年的I/O大会上发布的一个网络请求的框架,Volley在性能方面进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载