Redian新闻
>
9000ED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
avatar
9000ED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!# PhotoGear - 摄影器材
n*e
1
在网上和版上搜了半天,implement一个thread-safe blockingqueue. 大家看看有没有
问题:
import java.utils.LinkedList;
public class BlockingQueue {
private int capactiy;
private LinkedList elements;

public BlockingQueue(int capacity) {
if (capacity <=0 ) {
throw new exception();
}

this.capacity = capacity;
this.elements = new LinkedList ();
}

public synchronized void put(T t) {
while(elements.size() == capacity) {
wait();
}

boolean flag = false;

if (elements.size() == 0) {
flag = true;
}

elements.add(t);
if (flag) {
notifyAll();
}


}

public synchronized T take(T t) {
while(elements.size() == 0) {
wait();
}

boolean flag = false;

if (elements.size() == capacity) {
flag = true;
}

T t = elements.remove(0);

if (flag) {
notifyAll();
}

return t;
}
}
avatar
m*p
3
呼唤C++的!
avatar
n*e
5
感觉还是用java容易点
avatar
G*d
8
那你的玛米亚6怎么办?

【在 m*****n 的大作中提到】
: 上3.5k我就准备出 hehe
avatar
p*2
9
用go channel就可以了。
avatar
m*n
10
不玩了还不行。。

【在 G********d 的大作中提到】
: 那你的玛米亚6怎么办?
avatar
G*d
12
玛米亚6值得留着 唉。。。可以折腾其他扫描仪

【在 m*****n 的大作中提到】
: 不玩了还不行。。
avatar
m*p
13
这个怎么样?
#include
#include
#include
#include
template
class Queue
{
public:
T pop()
{
std::unique_lock mlock(mutex_);
while (queue_.empty())
{
cond_.wait(mlock);
}
auto item = queue_.front();
queue_.pop();
return item;
}
void pop(T& item)
{
std::unique_lock mlock(mutex_);
while (queue_.empty())
{
cond_.wait(mlock);
}
item = queue_.front();
queue_.pop();
}
void push(const T& item)
{
std::unique_lock mlock(mutex_);
queue_.push(item);
mlock.unlock();
cond_.notify_one();
}
void push(T&& item)
{
std::unique_lock mlock(mutex_);
queue_.push(std::move(item));
mlock.unlock();
cond_.notify_one();
}
private:
std::queue queue_;
std::mutex mutex_;
std::condition_variable cond_;
};
avatar
L*k
14
这个真的停产了?
avatar
x*o
15
1.5以上有API直接用了吧
avatar
n*e
17
面试题要考,没办法啊

【在 x****o 的大作中提到】
: 1.5以上有API直接用了吧
avatar
d*n
19
贴个C#版本
public class BlockingQueue
{
private Queue m_queue = new Queue();
private int m_waitingConsumers = 0;
public int Count
{
get
{
lock (m_queue)
return m_queue.Count;
}
}
public void Enqueue(T item)
{
lock (m_queue)
{
m_queue.Enqueue(item);
if (m_waitingConsumers > 0)
Monitor.Pulse(m_queue);
}
}
public T Dequeue()
{
lock (m_queue)
{
while (m_queue.Count == 0)
{
m_waitingConsumers++;
try
{
Monitor.Wait(m_queue);
}
finally
{
m_waitingConsumers--;
}
}
return m_queue.Dequeue();
}
}
}
avatar
d*n
21
前面有一贴用到Mutex效率不高
因为Mutex是kernel object
每次用到都到都有user mode和kernel mode的切换
我贴的是user mode的
工作中都可以拿来用的
avatar
d*n
23
再来个更先进的, blocking bounded queue
public class BlockingBoundedQueue
{
private Queue m_queue = new Queue();
private int m_capacity;
private object m_fullEvent = new object();
private int m_fullWaiters = 0;
private object m_emptyEvent = new object();
private int m_emptyWaiters = 0;
public BlockingBoundedQueue(int capacity)
{
m_capacity = capacity;
}
public int Count
{
get
{
lock (m_queue)
return m_queue.Count;
}
}
public void Clear()
{
lock (m_queue)
m_queue.Clear();
}
public bool Contains(T item)
{
lock (m_queue)
return m_queue.Contains(item);
}
public void Enqueue(T item)
{
lock (m_queue)
{
if (m_queue.Count == m_capacity)
{
m_fullWaiters++;
try
{
lock (m_fullEvent)
{
Monitor.Exit(m_queue);
Monitor.Wait(m_fullEvent);
Monitor.Enter(m_queue);
}
}
finally
{
m_fullWaiters--;
}
}
m_queue.Enqueue(item);
}
if (m_emptyWaiters > 0)
{
lock (m_emptyEvent)
Monitor.Pulse(m_emptyEvent);
}
}
public T Dequeue()
{
T item;
lock (m_queue)
{
while (m_queue.Count == 0)
{
m_emptyWaiters++;
try
{
lock (m_emptyEvent)
{
Monitor.Exit(m_queue);
Monitor.Wait(m_emptyEvent);
Monitor.Enter(m_queue);
}
}
finally
{
m_emptyWaiters--;
}
}
item = m_queue.Dequeue();
}
if (m_fullWaiters > 0)
lock (m_fullEvent)
Monitor.Pulse(m_fullEvent);
return item;
}
public T Peek()
{
lock (m_queue)
return m_queue.Peek();
}
}
avatar
G*d
24
你去看那行小字 discontinue

【在 L*****k 的大作中提到】
: redirected to plustek 7600Ai
: 这个如何?

avatar
J*3
25
不错 学习学习

【在 m**p 的大作中提到】
: 这个怎么样?
: #include
: #include
: #include
: #include
: template
: class Queue
: {
: public:
: T pop()

avatar
L*k
26
that I know.
就是想知道有没有便宜的替代品。

【在 G********d 的大作中提到】
: 你去看那行小字 discontinue
avatar
b*5
27
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/

【在 n****e 的大作中提到】
: 在网上和版上搜了半天,implement一个thread-safe blockingqueue. 大家看看有没有
: 问题:
: import java.utils.LinkedList;
: public class BlockingQueue {
: private int capactiy;
: private LinkedList elements;
:
: public BlockingQueue(int capacity) {
: if (capacity <=0 ) {
: throw new exception();

avatar
i*f
30
考虑到日元和美元的趋势,4000绝对有戏,早知道这么早停,先进个10台八台的屯着,
比股票都强。
avatar
n*e
31
多谢,,不会C#

【在 d***n 的大作中提到】
: 贴个C#版本
: public class BlockingQueue
: {
: private Queue m_queue = new Queue();
: private int m_waitingConsumers = 0;
: public int Count
: {
: get
: {
: lock (m_queue)

avatar
S*M
32
你的V700感觉怎么样?
我的V500实在太烂了

【在 z****6 的大作中提到】

avatar
t*t
33
求个C++的mutex-free queue, 单读单写.

【在 J****3 的大作中提到】
: 不错 学习学习
avatar
G*d
34
有啊 V ED for 135
8000Ed for medium format
8000Ed还是有点贵
我觉得medium formate需要一个不方便的但是画质好的
135需要一个可以批量的

【在 L*****k 的大作中提到】
: that I know.
: 就是想知道有没有便宜的替代品。

avatar
l*a
36
this chunky and delicate stuff is riskier than cameras/lenses

【在 i***f 的大作中提到】
: 考虑到日元和美元的趋势,4000绝对有戏,早知道这么早停,先进个10台八台的屯着,
: 比股票都强。

avatar
i*f
38
保修咋样?听说有的修完还坏?

【在 l***a 的大作中提到】
: this chunky and delicate stuff is riskier than cameras/lenses
avatar
s*u
39
C++11:
template
class BlockingQueue{
private:
queue _queue;
mutex _mutex;
condition_variable _cond;
public:
void push( const T& item){
unique_lock locker(_mutex);
_queue.push(item);
locker.unlock();
_cond.notify_one();
}


T pop(){
unique_lock locker(_mutex);
_cond.wait(locker, [=](){ return !_queue.empty() ;} ); //lambda
function, capture by value
T item = _queue.front();
_queue.pop();
return item;
}
};
avatar
l*a
40
180days warranty after repair

【在 i***f 的大作中提到】
: 保修咋样?听说有的修完还坏?
avatar
n*e
41
多谢!
我也一直想学习如何用C++来写BlockingQueue的

【在 s********u 的大作中提到】
: C++11:
: template
: class BlockingQueue{
: private:
: queue _queue;
: mutex _mutex;
: condition_variable _cond;
: public:
: void push( const T& item){
: unique_lock locker(_mutex);

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。