mirror of
https://github.com/tursom/GoCollections.git
synced 2025-02-26 20:20:31 +08:00
98 lines
2.2 KiB
Go
98 lines
2.2 KiB
Go
package collections
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/tursom/GoCollections/exceptions"
|
|
"github.com/tursom/GoCollections/lang"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
"unsafe"
|
|
)
|
|
|
|
type data struct {
|
|
lang.BaseObject
|
|
id int
|
|
index int
|
|
}
|
|
|
|
func (d *data) String() string {
|
|
return fmt.Sprintf("(%d,%d)", d.id, d.index)
|
|
}
|
|
|
|
func TestConcurrentLinkedQueue_NodeSize(t *testing.T) {
|
|
fmt.Println(unsafe.Alignof(concurrentLinkedStackNode[*data]{}))
|
|
fmt.Println(unsafe.Sizeof(concurrentLinkedStackNode[*data]{}))
|
|
}
|
|
|
|
func TestConcurrentLinkedQueue_Push(t *testing.T) {
|
|
queue := NewConcurrentLinkedQueue[*data]()
|
|
cond := sync.WaitGroup{}
|
|
cond.Add(1)
|
|
for i := 0; i < 10; i++ {
|
|
id := i
|
|
go func() {
|
|
cond.Wait()
|
|
for i := 0; i < 100; i++ {
|
|
_ = queue.Offer(&data{id: id, index: i})
|
|
}
|
|
}()
|
|
}
|
|
time.Sleep(time.Second)
|
|
cond.Done()
|
|
time.Sleep(time.Second)
|
|
fmt.Println(queue)
|
|
}
|
|
|
|
func TestConcurrentLinkedQueue_ThreadSafe(t *testing.T) {
|
|
times := 400000
|
|
queue := NewConcurrentLinkedQueue[*data]()
|
|
for i := 0; i < 100; i++ {
|
|
id := i
|
|
go func() {
|
|
//nodes := make([]ConcurrentLinkedQueueNode[*data], 0)
|
|
for j := 0; j < times; j++ {
|
|
_ = queue.Offer(&data{id: id, index: j})
|
|
//node, _ := queue.OfferAndGetNode(&data{id: id, index: j})
|
|
//nodes = append(nodes, node)
|
|
//fmt.Println(queue)
|
|
}
|
|
//time.Sleep(time.Second * 1)
|
|
fmt.Println(queue.Size())
|
|
//for _, node := range nodes {
|
|
// exceptions.Exec0r0(node.Remove)
|
|
//}
|
|
for j := 0; j < times; j++ {
|
|
offer, _ := queue.Poll()
|
|
if offer == nil {
|
|
panic("offer is nil")
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
time.Sleep(time.Second * 10)
|
|
if queue.Size() != 0 {
|
|
t.Fatalf(fmt.Sprintf("queue remain %d element, is not thread safe", queue.Size()))
|
|
}
|
|
//for !queue.IsEmpty() {
|
|
// fmt.Println(queue.Offer())
|
|
//}
|
|
}
|
|
|
|
func Test_concurrentLinkedQueueIterator_Remove(t *testing.T) {
|
|
queue := NewConcurrentLinkedQueue[lang.Int]()
|
|
nodes := make([]ConcurrentLinkedQueueNode[lang.Int], 0)
|
|
for i := 0; i < 1000; i++ {
|
|
node, _ := queue.OfferAndGetNode(lang.Int(i))
|
|
nodes = append(nodes, node)
|
|
//fmt.Println(queue)
|
|
}
|
|
for _, node := range nodes {
|
|
fmt.Println(exceptions.Exec0r1(node.RemoveAndGet))
|
|
}
|
|
if queue.Size() != 0 {
|
|
t.Fatalf(fmt.Sprintf("queue remain %d element, is not thread safe", queue.Size()))
|
|
}
|
|
}
|