473,387 Members | 1,575 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Threading questions

I have a simple need that I can't seem to locate the answer to in the docs.
Most examples show how a worker thread can pass data back to the thread that
created it.

I need to do the opposite.
Suppose the worker thread displays a form and the thread that created it
wants to change that form's text occasionally.

Can't seem to locate a simple way of doing that.

Thanks in advance

Jan 29 '06 #1
13 1186
Hope this helps....
The example is in C++ but the concept should be the same in VB

http://www.codeproject.com/managedcpp/mcppthreads01.asp

**Developer** wrote:
I have a simple need that I can't seem to locate the answer to in the docs.
Most examples show how a worker thread can pass data back to the thread that
created it.

I need to do the opposite.
Suppose the worker thread displays a form and the thread that created it
wants to change that form's text occasionally.

Can't seem to locate a simple way of doing that.

Thanks in advance

Jan 29 '06 #2
I don't have a problem starting a thread and passing it parameters.
It's after the thread is started I need to pass data to it - that's what I
don't know how to do.
Thanks for replying
"Ernie Otero" <eo**********@dsli.com> wrote in message
news:8_********************@dsli.com...
Hope this helps....
The example is in C++ but the concept should be the same in VB

http://www.codeproject.com/managedcpp/mcppthreads01.asp

**Developer** wrote:
I have a simple need that I can't seem to locate the answer to in the
docs.
Most examples show how a worker thread can pass data back to the thread
that created it.

I need to do the opposite.
Suppose the worker thread displays a form and the thread that created it
wants to change that form's text occasionally.

Can't seem to locate a simple way of doing that.

Thanks in advance


Jan 29 '06 #3
| Suppose the worker thread displays a form and the thread that created it
| wants to change that form's text occasionally.
If the worker thread is showing a Form, then you can use Control.Invoke on
that form or one of its control to transfer information to the worker
thread.

Alternatively if the worker thread does not have a Form, I have used a
System.Collections.Queue to send information to a thread. The thread would
look for information in the queue & operate on it.

Something like (VS 2003 syntax):

' untested, typed from memory.
Public Class ThreadRequestQueue

Private Readonly m_padlock As New Object
Private Readonly m_queue As New Queue
Private Readonly m_event As New AutoResetEvent(False)

' called from the Main thread
Public Sub AddRequest(ByVal request As Object)
SyncLock m_padlock
m_queue.Enqueue(Object)
End SyncLock
m_event.Set()
End Sub

' called from the Worker thread
Public Function GetRequest() As Object
' Check to see if there are already items available
SyncLock m_padlock
If m_queue.Count() > 0 Then
Return m_queue.DeQueue()
End If
End SyncLock

' Cannot block worker thread
' while waiting for the main thread to add requests
m_event.WaitOne()

' There must be an item
SyncLock m_padlock
Return m_queue.Dequeue()
End SyncLock
End Function

End Class

The Queue is used to send the requests from the Main thread to the Worker
thread. The m_padlock is used to protect the Queue.Enqueue & Queue.Dequeue
methods. The worker thread "goes to sleep" if there are no items in the
queue to work on, the AutoResetEvent is used to notify (wake up) the worker
thread there are more items available.

In VS 2005 (.NET 2.0) I would consider using a
System.Collections.Generic.Queue(Of T) instead of the object based Queue
above:
http://msdn2.microsoft.com/en-us/library/7977ey2c.aspx

--
Hope this helps
Jay [MVP - Outlook]
..NET Application Architect, Enthusiast, & Evangelist
T.S. Bradley - http://www.tsbradley.net
" **Developer**" <RE*************@a-znet.com> wrote in message
news:Oe*************@TK2MSFTNGP11.phx.gbl...
|I have a simple need that I can't seem to locate the answer to in the docs.
| Most examples show how a worker thread can pass data back to the thread
that
| created it.
|
| I need to do the opposite.
| Suppose the worker thread displays a form and the thread that created it
| wants to change that form's text occasionally.
|
|
|
| Can't seem to locate a simple way of doing that.
|
|
|
| Thanks in advance
|
|
|
Jan 30 '06 #4
There may be a subtle race condition in the ThreadRequestQueue class.
It depends on the level of thread-safety offered. As written it is
perfectly safe for one adder and one getter simultaneously. And that's
fine if that is it's intended use case. But, for those who may want a
solution that offers complete thread-safety (multiple adders and
getters) I recommend the following implementation.

Public Class ThreadRequestQueue

Private Readonly m_padlock As New Object
Private Readonly m_queue As New Queue
Private Readonly m_event As New AutoResetEvent(False)

' Can be called from any thread
Public Sub AddRequest(ByVal request As Object)
SyncLock m_padlock
m_queue.Enqueue(Object)
m_event.Set()
End SyncLock
End Sub

' Can be called from any thread
Public Function GetRequest() As Object
Do While True
m_event.WaitOne()
SyncLock m_padlock
If m_queue.Count > 0 Then
Return m_queue.Dequeue()
End If
End SyncLock
Loop
End Function

End Class

Brian

Jay B. Harlow [MVP - Outlook] wrote:
| Suppose the worker thread displays a form and the thread that created it
| wants to change that form's text occasionally.
If the worker thread is showing a Form, then you can use Control.Invoke on
that form or one of its control to transfer information to the worker
thread.

Alternatively if the worker thread does not have a Form, I have used a
System.Collections.Queue to send information to a thread. The thread would
look for information in the queue & operate on it.

Something like (VS 2003 syntax):

' untested, typed from memory.
Public Class ThreadRequestQueue

Private Readonly m_padlock As New Object
Private Readonly m_queue As New Queue
Private Readonly m_event As New AutoResetEvent(False)

' called from the Main thread
Public Sub AddRequest(ByVal request As Object)
SyncLock m_padlock
m_queue.Enqueue(Object)
End SyncLock
m_event.Set()
End Sub

' called from the Worker thread
Public Function GetRequest() As Object
' Check to see if there are already items available
SyncLock m_padlock
If m_queue.Count() > 0 Then
Return m_queue.DeQueue()
End If
End SyncLock

' Cannot block worker thread
' while waiting for the main thread to add requests
m_event.WaitOne()

' There must be an item
SyncLock m_padlock
Return m_queue.Dequeue()
End SyncLock
End Function

End Class

The Queue is used to send the requests from the Main thread to the Worker
thread. The m_padlock is used to protect the Queue.Enqueue & Queue.Dequeue
methods. The worker thread "goes to sleep" if there are no items in the
queue to work on, the AutoResetEvent is used to notify (wake up) the worker
thread there are more items available.

In VS 2005 (.NET 2.0) I would consider using a
System.Collections.Generic.Queue(Of T) instead of the object based Queue
above:
http://msdn2.microsoft.com/en-us/library/7977ey2c.aspx

--
Hope this helps
Jay [MVP - Outlook]
.NET Application Architect, Enthusiast, & Evangelist
T.S. Bradley - http://www.tsbradley.net
" **Developer**" <RE*************@a-znet.com> wrote in message
news:Oe*************@TK2MSFTNGP11.phx.gbl...
|I have a simple need that I can't seem to locate the answer to in the docs.
| Most examples show how a worker thread can pass data back to the thread
that
| created it.
|
| I need to do the opposite.
| Suppose the worker thread displays a form and the thread that created it
| wants to change that form's text occasionally.
|
|
|
| Can't seem to locate a simple way of doing that.
|
|
|
| Thanks in advance
|
|
|


Jan 30 '06 #5
Attached is a file containing an attempt at Threading.
There are two uppercase questions in the file.
Besides that I would appreciate any suggestions at all about the code -
anything at all that might be considered better.

It's a short, and I believe instructive because it is so short, example of
the main thread changing state of a worker thread, and of the worker thread
changing state of the main thread.
Thanks in advance for
Jan 30 '06 #6
Brian,
| But, for those who may want a
| solution that offers complete thread-safety (multiple adders and
| getters)
The hazards of cutting & pasting a post I made a year or so ago...

| Public Function GetRequest() As Object
| Do While True
| m_event.WaitOne()
| SyncLock m_padlock
| If m_queue.Count > 0 Then
| Return m_queue.Dequeue()
| End If
| End SyncLock
| Loop
| End Function

Your loop is superfluous! I would reduce GetRequest to:

| Public Function GetRequest() As Object
| m_event.WaitOne()
| SyncLock m_padlock
| If m_queue.Count > 0 Then
| Return m_queue.Dequeue()
| End If
| End SyncLock
| End Function

Your loop is superfluous, as the m_event.WaitOne will only allow a single
thread to pass (as its an AutoResetEvent). The event being set indicates
that at least a single item is in the queue. The return statement will exit
the loop. Ergo the loop itself is superfluous. Of course! this also means
that the "If m_queue.Count > 0 Then" is superfluous , so we can reduce it
further to:

| Public Function GetRequest() As Object
| m_event.WaitOne()
| SyncLock m_padlock
| Return m_queue.Dequeue()
| End SyncLock
| End Function

The "If m_queue.Count > 0 Then" is superfluous again, as the m_event.WaitOne
will only allow a single thread to pass (as its an AutoResetEvent)...
However! (loop or no loop, if or no if) you just introduced a severe bug I
was trying to avoid, all the threads block waiting for the next event,
although there are multiple entries in the queue.

Consider the case where one or more threads add 2 or more items to the Queue
before any of the readers have a chance to remove the next item. There is
only a single AutoResetEvent event, it is either set or reset. 2 items go
in, its set, one item comes out, its reset. All the threads block for the
third item, the third item goes in, the second item comes out, all the
thread block for the four item, items 4 to 10 goes in, item 3 comes out...

The way I setup GetRequest was:

- If there are items in the queue, return the next item, only allow a single
thread to do this! (prevent the above mentioned blockage).
- If there are no items in the queue, wait for the event, be certain to
allow threads to add to the queue
- The event was set, must be an item, return the next item. *** red flag ***

Ah! There's the rub, the first Dequeue might return the item before the
second Dequeue has a chance to see it:

For now I will use a variation of both of ours:

| > ' called from the Worker thread
| > Public Function GetRequest() As Object
| > ' Check to see if there are already items available
| > SyncLock m_padlock
| > If m_queue.Count() > 0 Then
| > Return m_queue.DeQueue()
| > End If
| > End SyncLock
| >
| Do While True
| m_event.WaitOne()
| SyncLock m_padlock
| If m_queue.Count > 0 Then
| Return m_queue.Dequeue()
| End If
| End SyncLock
| Loop
| > End Function

As this allows for the case where reader 1 gets the first Dequeue, while
reader 2 gets the WaitOne there by missing the second Dequeue, that the
first Dequeue just got... I wasn't considering that scenario as the original
code was not intended for multiple readers... Thanks! for pointing it out.

--
Hope this helps
Jay [MVP - Outlook]
..NET Application Architect, Enthusiast, & Evangelist
T.S. Bradley - http://www.tsbradley.net
"Brian Gideon" <br*********@yahoo.com> wrote in message
news:11**********************@g14g2000cwa.googlegr oups.com...
| There may be a subtle race condition in the ThreadRequestQueue class.
| It depends on the level of thread-safety offered. As written it is
| perfectly safe for one adder and one getter simultaneously. And that's
| fine if that is it's intended use case. But, for those who may want a
| solution that offers complete thread-safety (multiple adders and
| getters) I recommend the following implementation.
|
| Public Class ThreadRequestQueue
|
| Private Readonly m_padlock As New Object
| Private Readonly m_queue As New Queue
| Private Readonly m_event As New AutoResetEvent(False)
|
| ' Can be called from any thread
| Public Sub AddRequest(ByVal request As Object)
| SyncLock m_padlock
| m_queue.Enqueue(Object)
| m_event.Set()
| End SyncLock
| End Sub
|
| ' Can be called from any thread
| Public Function GetRequest() As Object
| Do While True
| m_event.WaitOne()
| SyncLock m_padlock
| If m_queue.Count > 0 Then
| Return m_queue.Dequeue()
| End If
| End SyncLock
| Loop
| End Function
|
| End Class
|
| Brian
|
| Jay B. Harlow [MVP - Outlook] wrote:
| > | Suppose the worker thread displays a form and the thread that created
it
| > | wants to change that form's text occasionally.
| > If the worker thread is showing a Form, then you can use Control.Invoke
on
| > that form or one of its control to transfer information to the worker
| > thread.
| >
| > Alternatively if the worker thread does not have a Form, I have used a
| > System.Collections.Queue to send information to a thread. The thread
would
| > look for information in the queue & operate on it.
| >
| > Something like (VS 2003 syntax):
| >
| > ' untested, typed from memory.
| > Public Class ThreadRequestQueue
| >
| > Private Readonly m_padlock As New Object
| > Private Readonly m_queue As New Queue
| > Private Readonly m_event As New AutoResetEvent(False)
| >
| > ' called from the Main thread
| > Public Sub AddRequest(ByVal request As Object)
| > SyncLock m_padlock
| > m_queue.Enqueue(Object)
| > End SyncLock
| > m_event.Set()
| > End Sub
| >
| > ' called from the Worker thread
| > Public Function GetRequest() As Object
| > ' Check to see if there are already items available
| > SyncLock m_padlock
| > If m_queue.Count() > 0 Then
| > Return m_queue.DeQueue()
| > End If
| > End SyncLock
| >
| > ' Cannot block worker thread
| > ' while waiting for the main thread to add requests
| > m_event.WaitOne()
| >
| > ' There must be an item
| > SyncLock m_padlock
| > Return m_queue.Dequeue()
| > End SyncLock
| > End Function
| >
| > End Class
| >
| > The Queue is used to send the requests from the Main thread to the
Worker
| > thread. The m_padlock is used to protect the Queue.Enqueue &
Queue.Dequeue
| > methods. The worker thread "goes to sleep" if there are no items in the
| > queue to work on, the AutoResetEvent is used to notify (wake up) the
worker
| > thread there are more items available.
| >
| > In VS 2005 (.NET 2.0) I would consider using a
| > System.Collections.Generic.Queue(Of T) instead of the object based Queue
| > above:
| > http://msdn2.microsoft.com/en-us/library/7977ey2c.aspx
| >
| > --
| > Hope this helps
| > Jay [MVP - Outlook]
| > .NET Application Architect, Enthusiast, & Evangelist
| > T.S. Bradley - http://www.tsbradley.net
| >
| >
| > " **Developer**" <RE*************@a-znet.com> wrote in message
| > news:Oe*************@TK2MSFTNGP11.phx.gbl...
| > |I have a simple need that I can't seem to locate the answer to in the
docs.
| > | Most examples show how a worker thread can pass data back to the
thread
| > that
| > | created it.
| > |
| > | I need to do the opposite.
| > | Suppose the worker thread displays a form and the thread that created
it
| > | wants to change that form's text occasionally.
| > |
| > |
| > |
| > | Can't seem to locate a simple way of doing that.
| > |
| > |
| > |
| > | Thanks in advance
| > |
| > |
| > |
|
Jan 31 '06 #7

Jay B. Harlow [MVP - Outlook] wrote:
However! (loop or no loop, if or no if) you just introduced a severe bug I
was trying to avoid, all the threads block waiting for the next event,
although there are multiple entries in the queue.


Yep. I totally missed that! It demonstrates just how difficult
synchronization can be. I think your modified solution works well.

Jan 31 '06 #8
Brian,
Looking at it, we may be able to reduce it to:

| > ' called from the Worker thread
| > Public Function GetRequest() As Object
| Do While True
| > ' Check to see if there are already items available
| SyncLock m_padlock
| If m_queue.Count > 0 Then
| Return m_queue.Dequeue()
| End If
| End SyncLock
| m_event.WaitOne()
| Loop
| > End Function

If there's an item return it, otherwise wait for the event.

Which avoids some of the duplication in my duplicate...

--
Hope this helps
Jay [MVP - Outlook]
..NET Application Architect, Enthusiast, & Evangelist
T.S. Bradley - http://www.tsbradley.net
"Brian Gideon" <br*********@yahoo.com> wrote in message
news:11*********************@g44g2000cwa.googlegro ups.com...
|
| Jay B. Harlow [MVP - Outlook] wrote:
| > However! (loop or no loop, if or no if) you just introduced a severe bug
I
| > was trying to avoid, all the threads block waiting for the next event,
| > although there are multiple entries in the queue.
| >
|
| Yep. I totally missed that! It demonstrates just how difficult
| synchronization can be. I think your modified solution works well.
|
Jan 31 '06 #9

Jay B. Harlow [MVP - Outlook] wrote:
Brian,
Looking at it, we may be able to reduce it to:

| > ' called from the Worker thread
| > Public Function GetRequest() As Object
| Do While True
| > ' Check to see if there are already items available
| SyncLock m_padlock
| If m_queue.Count > 0 Then
| Return m_queue.Dequeue()
| End If
| End SyncLock
| m_event.WaitOne()
| Loop
| > End Function

If there's an item return it, otherwise wait for the event.

Which avoids some of the duplication in my duplicate...


I took a good at it and I *think* it's okay. Jon updated his article
that uses Monitor.Pulse and Monitor.Wait as a solution to this problem
yesterday. The update was to fix a subtle bug.

<http://www.yoda.arachsys.com/csharp/threads/deadlocks.shtml>

Brian

Feb 2 '06 #10
Hello,
As a basic question, doesn't Control.BeginInvoke() work by placing
messages in a queue associated with the target Thread?
Bill

Jay B. Harlow [MVP - Outlook] wrote:
Brian,
Looking at it, we may be able to reduce it to:

| > ' called from the Worker thread
| > Public Function GetRequest() As Object
| Do While True
| > ' Check to see if there are already items available
| SyncLock m_padlock
| If m_queue.Count > 0 Then
| Return m_queue.Dequeue()
| End If
| End SyncLock
| m_event.WaitOne()
| Loop
| > End Function

If there's an item return it, otherwise wait for the event.

Which avoids some of the duplication in my duplicate...

--
Hope this helps
Jay [MVP - Outlook]
.NET Application Architect, Enthusiast, & Evangelist
T.S. Bradley - http://www.tsbradley.net
"Brian Gideon" <br*********@yahoo.com> wrote in message
news:11*********************@g44g2000cwa.googlegro ups.com...
|
| Jay B. Harlow [MVP - Outlook] wrote:
| > However! (loop or no loop, if or no if) you just introduced a severe bug
I
| > was trying to avoid, all the threads block waiting for the next event,
| > although there are multiple entries in the queue.
| >
|
| Yep. I totally missed that! It demonstrates just how difficult
| synchronization can be. I think your modified solution works well.
|


Feb 2 '06 #11

sw************@yahoo.com wrote:
Hello,
As a basic question, doesn't Control.BeginInvoke() work by placing
messages in a queue associated with the target Thread?
Bill


Yes. But, it only works if the target thread is running a message
loop. Worker threads do not typically have message loops.

Brian

Feb 2 '06 #12
Brian,
Monitor might be better.

Just thought of a problem with my code. If there are 4 threads waiting for
the queue, 3 items in the queue, when the 4th item is added, only 1 thread
will wake up, that single thread will process all the items... I'm not sure
that Jon's code solves the problem, as Monitor.Pulse only releases a single
thread.

As I stated before, my code was really intended for one or more producer,
single consumer....

--
Hope this helps
Jay [MVP - Outlook]
..NET Application Architect, Enthusiast, & Evangelist
T.S. Bradley - http://www.tsbradley.net
"Brian Gideon" <br*********@yahoo.com> wrote in message
news:11**********************@z14g2000cwz.googlegr oups.com...
|
| Jay B. Harlow [MVP - Outlook] wrote:
| > Brian,
| > Looking at it, we may be able to reduce it to:
| >
| > | > ' called from the Worker thread
| > | > Public Function GetRequest() As Object
| > | Do While True
| > | > ' Check to see if there are already items available
| > | SyncLock m_padlock
| > | If m_queue.Count > 0 Then
| > | Return m_queue.Dequeue()
| > | End If
| > | End SyncLock
| > | m_event.WaitOne()
| > | Loop
| > | > End Function
| >
| > If there's an item return it, otherwise wait for the event.
| >
| > Which avoids some of the duplication in my duplicate...
| >
|
| I took a good at it and I *think* it's okay. Jon updated his article
| that uses Monitor.Pulse and Monitor.Wait as a solution to this problem
| yesterday. The update was to fix a subtle bug.
|
| <http://www.yoda.arachsys.com/csharp/threads/deadlocks.shtml>
|
| Brian
|
Feb 3 '06 #13

Jay B. Harlow [MVP - Outlook] wrote:
Brian,
Monitor might be better.

Just thought of a problem with my code. If there are 4 threads waiting for
the queue, 3 items in the queue, when the 4th item is added, only 1 thread
will wake up, that single thread will process all the items... I'm not sure
that Jon's code solves the problem, as Monitor.Pulse only releases a single
thread.


Yep. I suppose that isn't necessarily a problem though. It just
depends on what behavior you want. You could use the ManualResetEvent
instead which does wake all threads. Jon mentioned that problem in a
post recently and he basically said that you could change that behavior
in his solution by using PulseAll instead Pulse, but for most scenarios
he saw no compelling reason to do so.

I was comparing the execution flow with your revised solution and Jon's
solution. Functionally, they are very similar. AutoResetEvent.Set and
AutoResetEvent.WaitOne appear to have the same semantics as
Monitor.Pulse and Monitor.Wait. ManualResetEvent.Set and
ManualResetEvent.WaitOne appear to have the same semantics as
Monitor.PulseAll and Monitor.Wait.

Feb 3 '06 #14

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

65
by: Anthony_Barker | last post by:
I have been reading a book about the evolution of the Basic programming language. The author states that Basic - particularly Microsoft's version is full of compromises which crept in along the...
13
by: Varun | last post by:
Hi Friends, Department of Information Technology, Madras Institute of Technology, Anna University, India is conducting a technical symposium, Samhita. As a part of samhita, an Online Programming...
4
by: Antal Rutz | last post by:
Hi, All! I'm new to threading. I have some design questions: Task: I collect data and store them in an RDBMS (mysql or pgsql) The question is how to do that with threading? The...
77
by: Jon Skeet [C# MVP] | last post by:
Please excuse the cross-post - I'm pretty sure I've had interest in the article on all the groups this is posted to. I've finally managed to finish my article on multi-threading - at least for...
3
by: mjheitland | last post by:
Hi, I like to know how many threads are used by a Threading.Timer object. When I create a Threading.Timer object calling a short running method every 5 seconds I expected to have one additional...
4
by: Bob | last post by:
- For cleanup, is it sufficient to set a Thread to Nothing after it's done? - It is OK to pass objects out of the thread? (dumb question maybe but I want to be sure) - What's the best way to...
9
by: akrapus | last post by:
Hi, I am trying to understand how to use threading in Python. I get threading as a concept, but not the implementation. In order to start threading, do you call it as a separate function,...
4
by: DBC User | last post by:
I have a background process which reads a table to see if there are any pending requests. If there are any, then it will start a worker thread (only 10 allowed at a time) and executes a method. In...
7
by: kimiraikkonen | last post by:
Hello experts, I've been already working on a project and also asked and i've managed to create a basic Gmail mail sender, but i want to add a progressbar that shows "sending is in progress" but...
126
by: Dann Corbit | last post by:
Rather than create a new way of doing things: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html why not just pick up ACE into the existing standard:...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.