<div dir="ltr"><br><div class="gmail_extra">Two or more code units want to do basically the same thing at almost the same moment.  Whichever one does the thing first (or sometimes, second) wins, and the other loses.</div><div class="gmail_extra"><br></div><div class="gmail_extra">EG, imagine two processes communicating over shared memory. If they both want to write to variable x in shared memory at almost the same moment, whichever one writes second "wins", because the write of the first is wiped out by the write of the second.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Some race conditions aren't much of a problem, but some of them can be a source of really hard-to-track-down bugs.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_quote">On Fri, Dec 11, 2015 at 4:45 PM, MJ Williams <span dir="ltr"><<a href="mailto:matthewjwilliams101@gmail.com" target="_blank">matthewjwilliams101@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">What is a `race condition'?<br>
<div class="HOEnZb"><div class="h5"><br>
On 11/12/2015, Christopher Allen <<a href="mailto:cma@bitemyapp.com">cma@bitemyapp.com</a>> wrote:<br>
> Having the option of communicating by sharing memory, message-passing style<br>
> (copying), or copy-on-write semantics in Haskell programs is why I've found<br>
> Haskell to be a real pleasure for performance (latency, mostly) sensitive<br>
> services I frequently work on. I get a superset of options in Haskell for<br>
> which I don't have any one choice that can really match it in concurrency<br>
> problems or single-machine parallelism. There's some work to be done to<br>
> catch up to OTP, but the community is inching its way a few directions<br>
> (Cloud Haskell/distributed haskell, courier, streaming lib + networking,<br>
> etc.)<br>
><br>
> Generally I prefer to build out services in a conventional style (breaking<br>
> out capacities like message backends or persistence into separate<br>
> machines), but the workers/app servers are all in Haskell. That is, I don't<br>
> try to replicate the style of cluster you'd see with Erlang services in<br>
> Haskell, but I know people that have done so and were happy with the<br>
> result. Being able to have composable concurrency via STM without<br>
> compromising correctness is _no small thing_ and the cheap threads along<br>
> with other features of Haskell have served to make it so that concurrency<br>
> and parallelization of Haskell programs can be a much more modular process<br>
> than I've experienced in many other programming languages. It makes it so<br>
> that I can write programs totally oblivious to concurrency or parallelism<br>
> and then layer different strategies of parallelization or synchronization<br>
> after the fact, changing them out at runtime if I so desire! This is only<br>
> possible for me in Haskell because of the non-strict semantics and<br>
> incredible kit we have at our disposal thanks to the efforts of Simon<br>
> Marlow and others. Much of this is ably covered in Marlow's book at:<br>
> <a href="http://chimera.labs.oreilly.com/books/1230000000929" rel="noreferrer" target="_blank">http://chimera.labs.oreilly.com/books/1230000000929</a><br>
><br>
> Side bar: although using "pure" with respect to effects is the common usage<br>
> now, I'd urge you to consider finding a different wording since the<br>
> original (and IMHO more meaningful) denotation of pure functional<br>
> programming was about semantics and not the presence or absence of effects.<br>
> The meaning was that you had a programming language whose semantics were<br>
> lambda-calculus-and-nothing-more. This can be contrasted with ML where the<br>
> lambda calculus is augmented with an imperative language that isn't<br>
> functional or a lambda calculus. Part of the problem with making purity<br>
> about effects rather than semantics is the terrible imprecision confuses<br>
> new people. They'll often misunderstand it as, "Haskell programs can't<br>
> perform effects" or they'll think it means stuff in "IO" isn't pure - which<br>
> is false. We benefit from having a pure functionalal programming language<br>
> _especially_ in programs that emit effects. Gabriel Gonzalez has a nice<br>
> article demonstrating some of this:<br>
> <a href="http://www.haskellforall.com/2015/03/algebraic-side-effects.html" rel="noreferrer" target="_blank">http://www.haskellforall.com/2015/03/algebraic-side-effects.html</a><br>
><br>
> When I want to talk about effects, I say "effect". When I want to say<br>
> something that doesn't emit effects, I say "effect-free" and when it does,<br>
> "effectful". Sometimes I'll say "in IO" for the latter as well, where "in<br>
> IO" can be any type that has IO in the outermost position of the final<br>
> return type.<br>
><br>
> But, in the end, I'm not really here to convince anybody to use Haskell.<br>
> I'm working on <a href="http://haskellbook.com/" rel="noreferrer" target="_blank">http://haskellbook.com/</a> with my coauthor Julie because I<br>
> thought it was unreasonably difficult and time-consuming to learn a<br>
> language that is quite pleasant and productive to use in my day to day<br>
> work. If Haskell picks up in popularity, cool - more libraries! If not,<br>
> then it remains an uncommon and not well-understood competitive advantage<br>
> in my work. I'm not sure I mind either outcome as long as the community<br>
> doesn't contract and it seems to be doing the opposite of that lately.<br>
><br>
> I use Haskell because I'm lazy and impatient. I do not tolerate tedious,<br>
> preventable work well. Haskell lets me break down my problems into<br>
> digestible units, it forces the APIs I consume to declare what chicanery<br>
> they're up to, it gives me the nicest kit for my work I've ever had at my<br>
> disposal. It's not perfect - it's best if you're comfortable with a unix-y<br>
> toolkit, but there's Haskellers on Windows keeping the lights on too.<br>
><br>
> Best of luck to Abhishek whatever they decide to do from here. I won't<br>
> pretend Haskell is "easy" - you have to learn more before you can write the<br>
> typical software project, but it's an upfront cliff sorta thing that<br>
> converts into a long-term advantage if you're willing to do the work. This<br>
> is more the case than what I found with Clojure, Erlang, Java, C++, Go,<br>
> etc. They all have a gentler upfront productivity cliff, but don't pay off<br>
> nearly as well long-term in my experience. YMMV.<br>
><br>
> On Fri, Dec 11, 2015 at 3:13 PM, Darren Grant <<a href="mailto:dedgrant@gmail.com">dedgrant@gmail.com</a>> wrote:<br>
><br>
>> Regarding concurrency+immutability with respect to both reliability and<br>
>> performance:<br>
>><br>
>> One way to think about synchronizing concurrent programs is by sharing<br>
>> memory. If the content of that memory changes, then there is a risk of<br>
>> race<br>
>> conditions arising in the affected programs. (A common source of vexing<br>
>> bugs, and complications for compilers.) But if the contents are somehow<br>
>> guaranteed not to change (ie. a specific definition of immutability),<br>
>> then<br>
>> no race conditions are possible for the lifetime of access to that<br>
>> memory.<br>
>><br>
>> Although this is a greatly simplified illustrative explanation, it is<br>
>> generally at the heart of arguments for immutability aiding performance.<br>
>> Unchanging regions of memory tend to permit simpler sorts of models since<br>
>> limitations are lifted on synchronization. This in turn allows both more<br>
>> freedom to pursue many otherwise tricky optimizations, such as ex.<br>
>> deciding<br>
>> when to duplicate based on cache geometry, trivially remembering old<br>
>> results, etc.<br>
>><br>
>> Regarding the discourse on purely functional programs not having side<br>
>> effects:<br>
>><br>
>> Writing pure programs without side effects is a little tricky to talk<br>
>> about, since this has some very precise technical meanings depending on<br>
>> whom you talk to. (What constitutes an effect? Where is the line between<br>
>> intentional and unintentional drawn?)<br>
>><br>
>> Maybe think of this statement as part of the continuum of arguments about<br>
>> languages that allow us to write simpler programs that more precisely<br>
>> state<br>
>> the intended effects.<br>
>><br>
>> Cheers,<br>
>> Darren<br>
>> On Dec 11, 2015 07:07, "Abhishek Kumar" <<a href="mailto:abhishekkmr18@gmail.com">abhishekkmr18@gmail.com</a>> wrote:<br>
>><br>
>>> I am a beginner in haskell.I have heard a lot about haskell being great<br>
>>> for parallel programming and concurrency but couldn't understand<br>
>>> why?Aren't<br>
>>> iterative algorithms like MapReduce more suitable to run parallely?Also<br>
>>> how<br>
>>> immutable data structures add to speed?I'm having trouble understanding<br>
>>> very philosophy of functional programming, how do we gain by writing<br>
>>> everything as functions and pure code(without side effects)?<br>
>>> Any links or references will be a great help.<br>
>>> Thanks<br>
>>> Abhishek Kumar<br>
>>><br>
>>> _______________________________________________<br>
>>> Beginners mailing list<br>
>>> <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
>>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
>>><br>
>>><br>
>> _______________________________________________<br>
>> Beginners mailing list<br>
>> <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
>><br>
>><br>
><br>
><br>
> --<br>
> Chris Allen<br>
> Currently working on <a href="http://haskellbook.com" rel="noreferrer" target="_blank">http://haskellbook.com</a><br>
><br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Dan Stromberg</div>
</div></div>