<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}

h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}

h1 {
        color: #000000;
        font-size: 28pt;
}

h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}

h3 {
        font-size: 18px;
}

h4 {
        font-size: 16px;
}

h5 {
        font-size: 14px;
}

h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}

hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
    display: inherit;
}

p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}

a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}

#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}

button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}

code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}

code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}

pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}

pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}

#ws { background-color: #f8f8f8; }


.bloop_markdown table {
border-collapse: collapse;  
font-family: Helvetica, arial, freesans, clean, sans-serif;  
color: rgb(51, 51, 51);  
font-size: 15px; line-height: 25px;
padding: 0; }

.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
     
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }

.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }

.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }

.bloop_markdown blockquote{
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

code, pre, #ws, #message {
    word-break: normal;
    word-wrap: normal;
}

hr {
    display: inherit;
}

.bloop_markdown :first-child {
    -webkit-margin-before: 0;
}

code, pre, #ws, #message {
    font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}


.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><ul>
<li>Do you care about the order in which your queue is filled?</li>
<li>Do you have multiple queues - I’m asking because your serial queue is not part of <code>Queue&lt;T&gt;</code>?!</li>
</ul>

<p>You could add your <code>DispatchQueue</code> right into <code>Queue&lt;T&gt;</code>.
It depends on your situation and your goal but sometime you could optimise your code with something like <code>self._queue.async(flags: .barrier) { … }</code>.</p>

<p>This required a concurrent dispatch queue, it will not block (like <code>sync</code> does) but it won’t run asynchronously with any other task in your dispatch queue <code>(flags: .barrier)</code>.</p>

<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1474645485055504128" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">--&nbsp;<br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 23. September 2016 um 17:34:56, Ron Olson via swift-users (<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div><div></div><div>



<title></title>


<div style="font-family:sans-serif">
<div style="white-space:normal">
<p dir="auto">Hey all-</p>
<p dir="auto">I used Erica's queue example (<a href="http://ericasadun.com/2016/03/08/swift-queue-fun/" style="color:#3983C4">http://ericasadun.com/2016/03/08/swift-queue-fun/</a>)
to implement a queue in a multi-threaded Swift app (quick aside, is
it 'correct' to say multithreaded when using DispatchQueue?). I
spawn a number of objects on a .concurrent DispatchQueue and they
all throw strings into the queue, where the main thread pops from
the queue and prints it out.</p>
<p dir="auto">In C/C++ I'd create a mutex and use that for pushing
and popping. In Swift 3 I did wrapped the methods in a serial
queue:</p>
<p dir="auto">let serialQueue = DispatchQueue(label:
"log.queue")</p>
<p dir="auto">// <a href="http://ericasadun.com/2016/03/08/swift-queue-fun/" style="color:#3983C4">http://ericasadun.com/2016/03/08/swift-queue-fun/</a><br>

public struct Queue&lt;T&gt;: ExpressibleByArrayLiteral {<br>
/// backing array store<br>
public private(set) var elements: Array&lt;T&gt; = []</p>
<pre style="background-color:#F7F7F7; border-radius:5px 5px 5px 5px; margin-left:15px; margin-right:15px; max-width:90vw; overflow-x:auto; padding:5px" bgcolor="#F7F7F7"><code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0" bgcolor="#F7F7F7">/// introduce a new element to the queue in O(1) time
public mutating func push(_ value: T) {
    serialQueue.sync {
        elements.append(value)
    }
}

/// remove the front of the queue in O(`count` time
public mutating func pop() -&gt; T? {
    var retValue: T? = nil

    serialQueue.sync {
        if isEmpty == false {
            retValue = elements.removeFirst()
        }
    }

    return retValue
}

/// test whether the queue is empty
public var isEmpty: Bool { return elements.isEmpty }

/// queue size, computed property
public var count: Int {
    var count: Int = 0

    serialQueue.sync {
        count = elements.count
    }
    return count
}

/// offer `ArrayLiteralConvertible` support
public init(arrayLiteral elements: T...) {
    serialQueue.sync {
        self.elements = elements
    }
}
</code></pre>
<p dir="auto">}</p>
<p dir="auto">This is working; I have tested it with 50, uh,
threads, and have had zero problems. So I'm content to go on my
merry way and use it, but wanted to get some thoughts about whether
this is the 'right' way and if there is something more
Swift-y/libDispatch-y that I should use instead.</p>
<p dir="auto">Thanks for any info,</p>
<p dir="auto">Ron</p>
</div>
</div>


_______________________________________________<br>swift-users mailing list<br>swift-users@swift.org<br>https://lists.swift.org/mailman/listinfo/swift-users<br></div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>