当前位置: 首页>>代码示例>>Golang>>正文


Golang atomic.CompareAndSwapInt32函数代码示例

本文整理汇总了Golang中sync/atomic.CompareAndSwapInt32函数的典型用法代码示例。如果您正苦于以下问题:Golang CompareAndSwapInt32函数的具体用法?Golang CompareAndSwapInt32怎么用?Golang CompareAndSwapInt32使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。


在下文中一共展示了CompareAndSwapInt32函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。

示例1: SlightlyConcurrentMergeSort

func SlightlyConcurrentMergeSort(data []int) {
	var activeWorkers int32
	var aux func([]int)
	aux = func(data []int) {
		if len(data) <= 1 {
			return
		}
		pivot := len(data) / 2

		left := append([]int{}, data[:pivot]...)
		right := append([]int{}, data[pivot:]...)

		curActiveWorkers := atomic.LoadInt32(&activeWorkers)

		if curActiveWorkers < int32(runtime.NumCPU()) && atomic.CompareAndSwapInt32(&activeWorkers, curActiveWorkers, curActiveWorkers+1) {

			var wg sync.WaitGroup
			wg.Add(1)
			go func() {
				aux(left)
				wg.Done()
			}()
			aux(right)
			wg.Wait()
		} else {
			MergeSort(left)
			MergeSort(right)
		}
		Merge(data, left, right)

		curActiveWorkers = atomic.LoadInt32(&activeWorkers)
		atomic.CompareAndSwapInt32(&activeWorkers, curActiveWorkers, curActiveWorkers-1)
	}
	aux(data)
}
开发者ID:skelterjohn,项目名称:tradeoffs,代码行数:35,代码来源:mergesort.go

示例2: stop

func (self *supervisorWithPidfile) stop() {
	if 1 != atomic.LoadInt32(&self.owner) {
		atomic.CompareAndSwapInt32(&self.srv_status, SRV_RUNNING, SRV_INIT)
		self.logString("[sys] ignore process\r\n")
		self.logString("[sys] ====================  srv  end  ====================\r\n")
		return
	}

	defer func() {
		if o := recover(); nil != o {
			self.last_error = errors.New(fmt.Sprint(o))
		} else {
			self.last_error = nil
		}
	}()

	if !atomic.CompareAndSwapInt32(&self.srv_status, SRV_RUNNING, SRV_STOPPING) &&
		!atomic.CompareAndSwapInt32(&self.srv_status, SRV_STARTING, SRV_STOPPING) {
		return
	}

	self.interrupt()
	atomic.CompareAndSwapInt32(&self.srv_status, SRV_STOPPING, PROC_INIT)
	atomic.StoreInt32(&self.owner, 0)
	self.logString("[sys] ====================  srv  end  ====================\r\n")
}
开发者ID:runner-mei,项目名称:daemontools,代码行数:26,代码来源:supervisor_with_pidfile.go

示例3: Run

func (r *RunnaStyle) Run(f Runnable) {
	if atomic.CompareAndSwapInt32(&r.sem, 0, 1) {
		go func() {
			ticker := time.NewTicker(r.RunInterval)
			defer ticker.Stop()

			fmt.Println("let's run")
			var idle int32 = 0
			for {
				if atomic.LoadInt32(&r.sem) == -1 {
					return
				}
				<-ticker.C

				if f() {
					idle = 0
				} else {
					idle++
				}

				if idle >= r.maxidle {
					fmt.Println("idle for", idle)
					break
				}
			}

			atomic.CompareAndSwapInt32(&r.sem, 1, 0)
		}()
	} else {
		fmt.Println("already running")
	}
}
开发者ID:hardPass,项目名称:code_go_network,代码行数:32,代码来源:RunnaStyle.go

示例4: prodConsSwap

func prodConsSwap() {
	wg := new(sync.WaitGroup)
	n := 1000000
	var lock int32 // Global.
	atomic.StoreInt32(&lock, 0)

	wg.Add(1)
	go func() {
		for i := 0; i < n; i++ {
			for !atomic.CompareAndSwapInt32(&lock, 0, 1) {
			}

			counter++

			atomic.StoreInt32(&lock, 0)
		}
		wg.Done()
	}()

	wg.Add(1)
	go func() {
		for i := 0; i < n; i++ {
			for !atomic.CompareAndSwapInt32(&lock, 0, 1) {
			}

			counter--

			atomic.StoreInt32(&lock, 0)
		}
		wg.Done()
	}()

	wg.Wait()
}
开发者ID:kzhk,项目名称:sync_example,代码行数:34,代码来源:producerConsumer.go

示例5: peerConnect

// Creates direct connection to caller to speed response time.
func (s *session) peerConnect(peer string) error {

	s.connMapLock.RLock()
	if _, ok := s.connMap[peer]; ok {
		s.connMapLock.RUnlock()
		return nil
	}
	s.connMapLock.RUnlock()

	if !atomic.CompareAndSwapInt32(&s.peerLock, 0, 1) {
		return nil
	}
	defer atomic.CompareAndSwapInt32(&s.peerLock, 1, 0)

	socketf := fmt.Sprintf("%s.%s", s.socketf, peer)

	conn, err := net.Dial("unix", socketf)
	if err != nil {
		return err
	}
	c := s.addconnection(conn)

	// Forgo logging on peer connection.
	go func() {
		if err := c.reciever(); err != nil && err != ErrClosed {
			s.log.Println(err)
		}
	}()

	return nil
}
开发者ID:cmcoffee,项目名称:go-blab,代码行数:32,代码来源:blab.go

示例6: clean

func (b *Buffer) clean() {
	if b.cleanLock == 1 || !atomic.CompareAndSwapInt32(&b.cleanLock, 0, 1) {
		return
	}

	if b.voteCount >= b.peerCount {
		for {
			if atomic.CompareAndSwapInt32(&b.voteLock, 0, 1) {
				b.peerTail = b.nextPeerTail
				b.voteCount = 0
				b.voteRound++

				b.voteLock = 0
				break
			}
		}
	}

	for b.tail != b.peerTail {
		b.values[b.tail] = nil

		b.tail++
		if b.tail > b.maxIdx {
			b.tail = 0
		}
	}

	b.cleanLock = 0

}
开发者ID:jashper,项目名称:bitmask-go,代码行数:30,代码来源:buffer.go

示例7: updateQueryCache

func (a *HotActor) updateQueryCache(t time.Time) error {
	defer atomic.CompareAndSwapInt32(&a.queryCacheUpdated, 1, 0)
	if !atomic.CompareAndSwapInt32(&a.queryCacheUpdated, 0, 1) {
		return nil
	}
	if (t.Unix() - a.lastQueryCacheUpdate.Unix()) < GOAT_UPDATE_SPAN_SEC {
		return nil
	}
	qcsize := len(a.queryDurations)
	a.wg = utils.NewWaitGroup(2 * qcsize) //hot and flame
	var from time.Time
	for i := 0; i < qcsize; i++ {
		if a.queryDurations[i] > 0 {
			from = t.Add(-1 * a.queryDurations[i])
		} else {
			from = time.Time{}
		}
		go a.updateQueryCacheTask(from, t, proto.TopicListRequest_Hot, &a.hotQueryCache[i], a.wg)
		go a.updateQueryCacheTask(from, t, proto.TopicListRequest_Flame, &a.flameQueryCache[i], a.wg)
	}
	if err := a.wg.Wait(); err != nil {
		log.Printf("update fails with %v", err)
		a.available = false
		return err
	} else {
		log.Printf("update success")
		a.available = true
		a.lastQueryCacheUpdate = t
	}
	return nil
}
开发者ID:umegaya,项目名称:channer,代码行数:31,代码来源:hot.go

示例8: GetMsgNum

// 获取uuid的离线消息数量
func GetMsgNum(uuid string) int {

	var (
		n   int
		err error
	)

	if atomic.CompareAndSwapInt32(&offlinemsg_readMark1, 0, 1) {
		n, err = redis.Int(offlinemsg_readCon1.Do("LLEN", uuid))
		atomic.StoreInt32(&offlinemsg_readMark1, 0)

	} else if atomic.CompareAndSwapInt32(&offlinemsg_readMark2, 0, 1) {
		n, err = redis.Int(offlinemsg_readCon2.Do("LLEN", uuid))
		atomic.StoreInt32(&offlinemsg_readMark2, 0)

	} else if atomic.CompareAndSwapInt32(&offlinemsg_readMark3, 0, 1) {
		n, err = redis.Int(offlinemsg_readCon3.Do("LLEN", uuid))
		atomic.StoreInt32(&offlinemsg_readMark3, 0)

	} else if atomic.CompareAndSwapInt32(&offlinemsg_readMark4, 0, 1) {
		n, err = redis.Int(offlinemsg_readCon4.Do("LLEN", uuid))
		atomic.StoreInt32(&offlinemsg_readMark4, 0)
	}

	if err != nil {
		return 0
	}
	return n
}
开发者ID:neutony,项目名称:chatserver,代码行数:30,代码来源:offlinemsg.go

示例9: Put

func (bl *BufferListener) Put(value []byte) {
	b := bl.buffer

	tempSlice := make([]byte, len(value))
	copy(tempSlice, value)

	for {
		putIdx := b.putReserve

		newIdx := putIdx + 1
		if int(newIdx) > b.maxIdx {
			newIdx = 0
		}

		for int(newIdx) == b.tail {
			b.clean()
		}

		if atomic.CompareAndSwapInt32(&b.putReserve, putIdx, newIdx) {
			b.values[putIdx] = tempSlice

			for {
				temp := b.head

				if atomic.CompareAndSwapInt32(&b.head, temp, newIdx) {
					break
				}
			}

			break
		}
	}

	b.clean()
}
开发者ID:jashper,项目名称:bitmask-go,代码行数:35,代码来源:buffer.go

示例10: restart

// start first negotiation
// start n-1 data tun
func (c *Client) restart() (tun *Conn, rn int32) {
	if atomic.CompareAndSwapInt32(&c.restarting, 0, 1) {
		// discard old conn retrying
		c.pendingConn.clearAll()
		// discard requests are waiting for tokens
		c.pendingTK.clearAll()
		// release mux
		if c.mux != nil {
			c.mux.destroy()
		}
		c.mux = newClientMultiplexer()
		// try negotiating connection infinitely until success
		for i := 0; tun == nil; i++ {
			if i > 0 {
				time.Sleep(RETRY_INTERVAL)
			}
			tun = c.initialNegotiation()
		}
		atomic.CompareAndSwapInt32(&c.restarting, 1, 0)
		atomic.CompareAndSwapInt32(&c.State, CLT_PENDING, CLT_WORKING)
		rn = atomic.AddInt32(&c.round, 1)
		for j := c.tp.parallels; j > 1; j-- {
			go c.StartTun(false)
		}
	}
	return
}
开发者ID:ygcoffice,项目名称:deblocus,代码行数:29,代码来源:client.go

示例11: gc

//gc dupnodelist
func (t *Btree) gc() {
	for {
		t.Lock()
		if atomic.CompareAndSwapInt32(&t.state, StateNormal, StateGc) {
			if len(t.dupnodelist) > 0 {
				id := t.dupnodelist[len(t.dupnodelist)-1]
				switch t.nodes[id].(type) {
				case *Node:
					*t.NodeCount--
				case *Leaf:
					*t.LeafCount--
				default:
					atomic.CompareAndSwapInt32(&t.state, StateGc, StateNormal)
					continue
				}
				t.FreeList = append(t.FreeList, id)
				t.dupnodelist = t.dupnodelist[:len(t.dupnodelist)-1]
				atomic.CompareAndSwapInt32(&t.state, StateGc, StateNormal)
			}
		} else {
			time.Sleep(time.Second)
		}
		t.Unlock()
	}
}
开发者ID:rsrsps,项目名称:btree-1,代码行数:26,代码来源:utils.go

示例12: GetLength

// 返回名称为key的list的长度
func (this *RedisListHelper) GetLength(key string) int {
	var (
		n   int
		err error
	)

	if atomic.CompareAndSwapInt32(&this.readMark1, 0, 1) {
		n, err = redis.Int(this.readCon1.Do("LLEN", key))
		atomic.StoreInt32(&this.readMark1, 0)

	} else if atomic.CompareAndSwapInt32(&this.readMark2, 0, 1) {
		n, err = redis.Int(this.readCon2.Do("LLEN", key))
		atomic.StoreInt32(&this.readMark2, 0)

	} else if atomic.CompareAndSwapInt32(&this.readMark3, 0, 1) {
		n, err = redis.Int(this.readCon3.Do("LLEN", key))
		atomic.StoreInt32(&this.readMark3, 0)

	} else if atomic.CompareAndSwapInt32(&this.readMark4, 0, 1) {
		n, err = redis.Int(this.readCon4.Do("LLEN", key))
		atomic.StoreInt32(&this.readMark4, 0)
	}

	if err != nil {
		return 0
	}
	return n
}
开发者ID:cautonwong,项目名称:chatserver,代码行数:29,代码来源:redislist.go

示例13: writerRoutine

func (pc *SocketClient) writerRoutine() {
writerloop:
	for {
		switch atomic.LoadInt32(&pc.state) {
		case SocketClosed:
			pc.changes.Lock()
			for _, v := range pc.queue {
				v.responseChan <- ErrShutdown
			}
			pc.changes.Unlock()
			break writerloop
		case SocketOpen:
			//log.Printf("[SocketClient] Writer state: Open")
			request := pc.writeQueueHead
			if request == nil {
				select {
				case request = <-pc.writeQueue:
					pc.writeQueueHead = request
					if request == nil {
						continue
					}
				case <-time.After(1 * time.Second):
					continue
				}
			}
			_, err := pc.conn.Write(request.request)
			if err != nil {
				log.Printf("[SocketClient] Write failed: %s", err.Error())
				atomic.CompareAndSwapInt32(&pc.state, SocketOpen, SocketReconnecting)
			} else {
				//log.Printf("[SocketClient] Wrote: %s", request.request)
				pc.writeQueueHead = nil
				request.sent = true
			}
		case SocketReconnecting:
			//log.Printf("[SocketClient] Writer state: Recon")
			pc.changes.Lock()
			conn, err := net.DialTCP(pc.address.Network(), nil, pc.address)
			if err == nil {
				pc.reader = bufio.NewReader(conn)
				pc.conn = conn
				sentshit := make([]int64, 0, 32)
				for k, v := range pc.queue {
					if v.sent {
						v.responseChan <- ErrReconnect
						sentshit = append(sentshit, k)
					}
				}
				for _, k := range sentshit {
					delete(pc.queue, k)
				}
				atomic.CompareAndSwapInt32(&pc.state, SocketReconnecting, SocketOpen)
			} else {
				log.Printf("[SocketClient] Reconnect failed: %s", err.Error())
				time.Sleep(5 * time.Second)
			}
			pc.changes.Unlock()
		}
	}
}
开发者ID:Auditorius,项目名称:go-socketclient,代码行数:60,代码来源:socketclient.go

示例14: Stop

func (this *Writer) Stop() {
	if !atomic.CompareAndSwapInt32(&this.stopFlag, 0, 1) {
		return
	}
	if atomic.CompareAndSwapInt32(&this.state, StateConnected, StateDisconnected) {
		this.Close()
	}
	close(this.exitChan)
}
开发者ID:kiloboot,项目名称:nsq,代码行数:9,代码来源:writer.go

示例15: ListenAndServe

// ListenAndServe listents to connections on the URI requested, and handles any
// incoming MQTT client sessions. It should not return until Close() is called
// or if there's some critical error that stops the server from running. The URI
// supplied should be of the form "protocol://host:port" that can be parsed by
// url.Parse(). For example, an URI could be "tcp://0.0.0.0:1883".
func (this *Server) ListenAndServe(uri string) error {
	defer atomic.CompareAndSwapInt32(&this.running, 1, 0)

	if !atomic.CompareAndSwapInt32(&this.running, 0, 1) {
		return fmt.Errorf("server/ListenAndServe: Server is already running")
	}

	this.quit = make(chan struct{})

	u, err := url.Parse(uri)
	if err != nil {
		return err
	}

	this.ln, err = net.Listen(u.Scheme, u.Host)
	if err != nil {
		return err
	}
	defer this.ln.Close()

	glog.Infof("server/ListenAndServe: server is ready...")

	var tempDelay time.Duration // how long to sleep on accept failure

	for {
		conn, err := this.ln.Accept()

		if err != nil {
			// http://zhen.org/blog/graceful-shutdown-of-go-net-dot-listeners/
			select {
			case <-this.quit:
				return nil

			default:
			}

			// Borrowed from go1.3.3/src/pkg/net/http/server.go:1699
			if ne, ok := err.(net.Error); ok && ne.Temporary() {
				if tempDelay == 0 {
					tempDelay = 5 * time.Millisecond
				} else {
					tempDelay *= 2
				}
				if max := 1 * time.Second; tempDelay > max {
					tempDelay = max
				}
				glog.Errorf("server/ListenAndServe: Accept error: %v; retrying in %v", err, tempDelay)
				time.Sleep(tempDelay)
				continue
			}
			return err
		}

		go this.handleConnection(conn)
	}
}
开发者ID:XcoderAlex,项目名称:surgemq,代码行数:61,代码来源:server.go


注:本文中的sync/atomic.CompareAndSwapInt32函数示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。