syncOnce的Go语言与C++11实现方法
2015-02-16 16:15
691 查看
Go语言中的sync.Once,用于实现"只执行一次"的功能。功能与pthread_once()差不多。
但pthread_once()可不通用,不过现在C++11终于有了std::call_once来实现这一功能。
虽然一个面向协程,一个面向线程,但这个点要实现的功能是一样的,把两种语言的实现记录一下。
在 http://www.cplusplus.com/reference/mutex/call_once/ 有C++11的相关例子,但用了很多新特性。
简化下,便于做对比.
没有传任何参数的 C++/Go例 子:
Go例子:
关于参数传递,C++是很容易解决的,直接在call_once后面加就行了 。
完毕!
MAIL: xcl_168@aliyun.com
BLOG:http://blog.csdn.net/xcl168
但pthread_once()可不通用,不过现在C++11终于有了std::call_once来实现这一功能。
虽然一个面向协程,一个面向线程,但这个点要实现的功能是一样的,把两种语言的实现记录一下。
在 http://www.cplusplus.com/reference/mutex/call_once/ 有C++11的相关例子,但用了很多新特性。
简化下,便于做对比.
没有传任何参数的 C++/Go例 子:
// call_once example #include <iostream> // std::cout #include <thread> // std::thread, std::this_thread::sleep_for #include <mutex> // std::call_once, std::once_flag std::once_flag flag; int Gid = 0; void setup() { Gid++; std::cout << "Called once " << Gid << std::endl; } void doprint() { std::call_once(flag, setup); } int main() { std::thread t1(doprint); std::thread t2(doprint); std::thread t3(doprint); std::thread t4(doprint); t1.join(); t2.join(); t3.join(); t4.join(); std::cout << "Gid: " << Gid << std::endl; }
Go例子:
package main import ( "fmt" "sync" "time" ) var once sync.Once var Gid int func setup() { Gid++ fmt.Println("Called once") } func doprint() { once.Do(setup) fmt.Println("doprint()...") } func main() { go doprint() go doprint() go doprint() go doprint() time.Sleep(time.Second) fmt.Println("Gid:", Gid) }
关于参数传递,C++是很容易解决的,直接在call_once后面加就行了 。
// call_once example #include <iostream> // std::cout #include <thread> // std::thread, std::this_thread::sleep_for #include <mutex> // std::call_once, std::once_flag std::once_flag flag; int Gid = 0; void setup(std::string parm) { Gid++; std::cout << "Called once! " << Gid << " parm:" << parm.c_str() << std::endl; } void doprint(std::string parm) { std::call_once(flag, setup, parm); } int main() { std::thread t1(doprint, "1"); std::thread t2(doprint, "2"); std::thread t3(doprint, "3"); std::thread t4(doprint, "4"); t1.join(); t2.join(); t3.join(); t4.join(); std::cout << "Gid: " << Gid << std::endl; }Go语言的sync.Once后面不允许直接传参数,但可以通过以下方法来变通。
package main import ( "fmt" "sync" "time" ) var once sync.Once var Gid int func doprint(parm string) { setup := func() { Gid++ fmt.Println("Called once! parm:", parm) } once.Do(setup) fmt.Println("doprint()...") } func main() { go doprint("1") go doprint("2") go doprint("3") go doprint("4") time.Sleep(time.Second) fmt.Println("Gid:", Gid) }
完毕!
MAIL: xcl_168@aliyun.com
BLOG:http://blog.csdn.net/xcl168
相关文章推荐
- Go语言服务器开发之简易TCP客户端与服务端实现方法
- go语言实现AES加密的方法
- GO语言实现列出目录和遍历目录的方法
- Go语言利用time.After实现超时控制的方法详解
- Go语言实现简单留言板的方法
- Go语言中通过结构体匿名字段实现方法的继承和重载
- Go语言实现定时器的方法
- Go语言中的实现类似泛型的方法
- Go语言模拟while语句实现无限循环的方法
- Go语言中接口组合的实现方法
- go语言实现sqrt的方法
- Go语言实现Fibonacci数列的方法
- go语言channel实现多核并行化运行的方法
- go语言实现一个简单的http客户端抓取远程url的方法
- Go语言实现字符串切片赋值的方法小结
- go语言优化参数过多方法,变相实现可选参数
- go语言中sort包的实现方法与应用详解
- go语言实现猜数字小游戏的方法
- go语言实现文件分割的方法